在iOS 4上使用OCMock验证使用代码134异常退出测试装置

时间:2010-08-03 21:10:33

标签: ios4 ocmock

我正在尝试将OCMock添加到我的iOS 4项目中。为了测试它,我有一个类Person,其中有一个方法-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 个答案:

答案 0 :(得分: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也是如此)。

答案 1 :(得分:2)

我说这是一个错误。验证应报告可用结果,即使它失败。

答案 2 :(得分: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];
}

答案 3 :(得分:0)

我找到的解决方法是使用XCTAssertNoThrow包装[mockObject expect]和[mockObject verify]调用,例如:

XCTAssertNoThrow([[mockTaskVC expect] showAlertWithTitle:containsString(@"Error") message:OCMOCK_ANY completion:OCMOCK_ANY], @"threw up exception");

这将捕获异常并使文本失败而不是崩溃。

致信作者:http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=315&p=710&hilit=unexpected+method+was+not+invoked+exception#p710