3

iOS 4 プロジェクトに OCMock を追加しようとしています。それをテストするために、Person1 つのメソッドを持つクラスがあり-helloます。このテストを実行すると:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock hello];

    [mock verify];
}

すべて問題なく、ビルドは成功します。次のhelloように電話を切ると:

- (void) testMock {
    id mock = [OCMockObject mockForClass:[Person class]];
    [[mock expect] hello];

    [mock verify];
}

期待したメソッドがモックで呼び出されなかったことを知らせるエラー メッセージが表示されることを期待しています。代わりに、テスト リグのクラッシュに関する不可解なメッセージが表示されます。

/Developer/Tools/RunPlatformUnitTests.include:451:0 Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

予想されるメソッドが呼び出されない場合、このクラッシュは正常ですか? 設定が悪いのでしょうか?

4

4 に答える 4

4

構成が悪いわけではありません。Apple が iOS4 をリリースしたときに、シミュレーター SDK に導入されたバグです。基本的に、NSInvocation オブジェクトを使用して呼び出されたコードが例外をスローした場合、その例外はキャッチできません。この問題が最初に現れたとき、私はここに書いた:

http://pivotallabs.com/users/adam/blog/articles/1302-objective-c-exceptions-thrown-inside-methods-invoked-via-nsinvocation-are-uncatchable

残念ながら、このバグは OCMock に影響を与えており、Apple はその修正にあまり関心を示していません。多くの人がバグレポートを提出しましたが、役に立ちませんでした。

これはあまり快適ではないことは承知していますが、Cedarをテストに使用すると、エラー メッセージがわずかに改善されます ( GTMについても同じことが当てはまると思います)。

于 2010-11-13T21:34:55.380 に答える
2

このバグは、2011 年 4 月の時点で Xcode 4/SDK 4.3 にまだ存在することがわかりました。たとえば、テスト A はパスし、テスト B はテスト リグをクラッシュさせます。

テスト A:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    [mock lowercaseString];

    [mock verify];
}

テスト B:

- (void)testAcceptsAndVerifiesExpectedMethods
{

    id mock = [OCMockObject mockForClass:[NSString class]];

    [[mock expect] lowercaseString];
    //[mock lowercaseString];

    [mock verify];
}
于 2011-04-07T02:44:16.110 に答える
2

バグだと思います。Verify は、失敗した場合でも、使用可能な結果を​​報告する必要があります。

于 2010-09-01T19:46:59.883 に答える