Spring が私の wisper リスナー メソッドをキャッシュしていることがわかりました (私は非常に単純なエンジンを書いています)。
例:
アプリ/モデル/myengine/my_class.rb
class Myengine::MyClass
include Wisper::Publisher
def something
# some logic
publish(:after_something, self)
end
end
config/initializers/wisper.rb
Wisper.subscribe(Myengine::MyObserver.new)
アプリ/オブザーバー/myengine/my_observer.rb
class Myengine::MyObserver
def after_something my_class_instance
# any changes here requires Spring manual restart in order to be reflected in tests
another_method
end
def another_method
# all changes here or in any other class methods works ok with Spring and are instantly visible in tests
return true
end
end
Spring の再起動とspring stop
は、本当に面倒なコマンドの手動実行を意味します。
さらに不思議なことにanother_method
、戻り値を false に変更すると、テストが失敗する可能性がありますが、これは問題ありませんが、after_something
メソッド本体を変更してテストに影響を与えないと (本体が何らかの形でキャッシュされているなど)。return false
after_something
この奇妙な動作はリスナーメソッド本体内でのみ表示され、すべてのロジックをクラス内の別のメソッドに移動することで簡単に克服できるため、優先度の高い問題ではありません。とにかく、混乱するかもしれません (特に、正確な問題を知らなかった最初の段階では)。