我正在尝试将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).
当没有调用预期的方法时,崩溃是否正常?我配置不好吗?
答案 0 :(得分:4)
您的配置不正确,这是Apple在发布iOS4时在模拟器SDK中引入的错误。基本上,如果使用NSInvocation对象调用的代码抛出异常,则该异常是无法捕获的。我第一次看到这个问题的时候写过这个问题:
不幸的是,这个漏洞影响了OCMock,Apple并没有对修复它感兴趣。很多人都提交了错误报告,但无济于事。
答案 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");
这将捕获异常并使文本失败而不是崩溃。