SUT に渡されるオブジェクトをモックしようとしています。渡されると、SUT はモックをいくつかのプロパティのオブザーバーとして登録します。SUT dealloc ではremoveObserver
、モックを呼び出します。これは OCMockito 0.23 では問題なく動作していましたが、1.0.0 に更新すると、このテストにより OCMockito が[HCIsEqual .cxx_destruct]
. 少しデバッグすると、次のMKTInvocationContainer
方法に進みます。
- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation
ここで、呼び出しはその引数を保持するように指示されます。リテインサイクルでしょうか?
さらに、私はいくつかの調査を行っておりNSProxy
、KVOとの間の非互換性を示すいくつかのSO回答を見つけました:
https://stackoverflow.com/a/17457155/2824409
しかし、なぜこれが OCMockito 0.23 で機能していたのに、現在は機能していないのか疑問に思います。何か案が?
私の場合の解決策は、モックを実際のオブジェクトに置き換えることです。これは問題なく動作しますが、ほとんど使用しないテスト スイート用にオブジェクト全体を構築するのは困難です。
いずれにせよ、KVO がモックでサポートされていない場合は、これを文書化し、適切に処理する必要があると思います。
[編集]
この問題の回避策を見つけました。
ここで説明されているように、カスタム ブロック ベースの KVO インフラストラクチャを使用しています: http://www.mikeash.com/pyblog/key-value-observing-done-right.html。現在、SUT は KVO のモックを登録しておりself
、ブロック内を渡しています。どこかに保持されていると思いますself
が、ブロック前に弱体化されているため、保持されるべきではありません...
Apple が提供するデフォルトの kvo フレームワークを使用すると、この問題が解決するようです。しかし、私はまだ根本的な問題について心配しています。OCMockito で何が変更され、これが失敗するようになりましたか?
何はともあれ、お手数をおかけいたしますが、よろしくお願いいたします。