2

SUT に渡されるオブジェクトをモックしようとしています。渡されると、SUT はモックをいくつかのプロパティのオブザーバーとして登録します。SUT dealloc ではremoveObserver、モックを呼び出します。これは OCMockito 0.23 では問題なく動作していましたが、1.0.0 に更新すると、このテストにより OCMockito が[HCIsEqual .cxx_destruct]. 少しデバッグすると、次のMKTInvocationContainer方法に進みます。

- (void)setInvocationForPotentialStubbing:(NSInvocation *)invocation

ここで、呼び出しはその引数を保持するように指示されます。リテインサイクルでしょうか?

さらに、私はいくつかの調査を行っておりNSProxy、KVOとの間の非互換性を示すいくつかのSO回答を見つけました:

NSProxy とキー値の監視

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 で何が変更され、これが失敗するようになりましたか?

何はともあれ、お手数をおかけいたしますが、よろしくお願いいたします。

4

1 に答える 1

0

git bisect見つけるための最良の方法は、OCMockitoで実行することだと思います。これは、どのコミットがコードを壊したかを正確に追跡するのに役立ちます。

のマニュアルページは次のgit bisectとおり です。 https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html

そして、ここに公式のチュートリアルがあります: http://git-scm.com/book/en/Git-Tools-Debugging-with-Git

あなたの場合、次のようなことをします:

$ git bisect start
$ git bisect bad v1.0.0
$ git bisect good v0.23

どのコミットがテストを壊したかがわかったら、コミット内のどの変更がテストを壊したかを正確に把握してみてください。次に戻ってきて、発見したことをお知らせください。次のリリースでこれを修正できるかどうかを判断できます。

このバグを公開するテスト プロジェクトがある場合は、二分することを気にしません (少なくとも退屈で時間があれば)。

于 2013-11-04T09:42:43.707 に答える