3

init*OCMockito を使用して、メソッドがその本体内で他のメソッドを呼び出しているかどうかをテストしたいと思います。これは可能ですか?[self myMethod]が呼び出されたかどうかを確認したいとしましょう。

私はそのような素朴な方法でそれをやろうとしてきましたが、ご想像のとおり、成功しませんでした:

it(@"should trigger myMethod", ^{
    DetailsView *mockDetailsView = mock([DetailsView class]);
    [mockDetailsView initWithFrame:CGRectZero];
    [verify(mockDetailsView) myMethod];
});
4

1 に答える 1

7

機能に応じて 3 つの可能性がありmyMethodます。

myMethodコールアウトの移動元init

オブジェクトの非常に具体的なロジックを認識している場合myMethodは、おそらくオブジェクトの所有者によって明示的に呼び出される必要があります。オブジェクトの作成は、初期状態を設定する以外に何もすべきではありません。それが入っていない場合は、init簡単にテストできます。

オブジェクトの状態を確認する

'myMethod` が何らかの方法でオブジェクトを構成する場合、メソッドが呼び出されたかどうかを確認するのではなく、そのプロパティまたはその状態をテストできます。これは二次的なものであるためです。最終結果が重要です。

メソッドをテスト...

最後に、 が呼び出されたかどうかを本当にテストする必要がありmyMethod、上記のいずれにも当てはまらない (発生しないはずです) 場合は、メソッド本体に property を設定できますself.myMethodCalled = YES。これは非常に醜いので、クラスから派生させmyMethod、そこでプロパティをオーバーライドして設定し、サブクラスをテストするこの呼び出しを検証します (これは安全ではなく、不純です)。

これは非常にハックであり、オブジェクト設計の観点からおそらく何かが間違っていることを示しています。

于 2015-03-25T12:43:10.527 に答える