Ios4 测试设备异常退出,代码134,iOS 4上的OCMock验证

Ios4 测试设备异常退出,代码134,iOS 4上的OCMock验证,ios4,ocmock,Ios4,Ocmock,我正在尝试将OCMock添加到我的iOS 4项目中。为了测试它,我有一个类Person,它有一个方法,-hello。当我运行此测试时: - (void) testMock { id mock = [OCMockObject mockForClass:[Person class]]; [[mock expect] hello]; [mock hello]; [mock verify]; } 一切正常,构建成功。如果我拿走hello呼叫,如下所示: - (voi

我正在尝试将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];
}
我希望得到一条错误消息,告诉我没有在mock上调用我期望的方法。相反,我得到了一个关于测试设备崩溃的神秘信息:

/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).

当未调用预期的方法时,此崩溃是否正常?我的配置不好吗?

我认为这是一个bug。Verify应该报告一个可用的结果,即使它失败了。

您没有错误的配置,这是Apple在发布iOS4时在simulator SDK中引入的错误。基本上,如果使用NSInvocation对象调用的代码抛出异常,则该异常是不可修补的。当这个问题第一次出现在这里时,我就写过:

不幸的是,这个错误影响了OCMock,苹果公司对修复它没有多大兴趣。许多人已经提交了错误报告,但没有结果


我意识到这一点让人感到不舒服,但当您使用它进行测试时,您会收到稍微好一点的错误消息(我相信对您来说也是如此)。

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];
}

我发现的一种解决方法是使用XCTAssertNoThrow包装[mockObject expect]和[mockObject verify]调用,例如:

XCTAssertNoThrow([[mockTaskVC expect] showAlertWithTitle:containsString(@"Error") message:OCMOCK_ANY completion:OCMOCK_ANY], @"threw up exception");
这将捕获异常并使文本失败,而不是崩溃


要归功于作者:

在iOS中测试NSManagedObject时,我也遇到了同样的错误。我通过编写一些代码来为我的托管对象上下文和模型进行不同的设置,从而解决了这个问题。它解决了我的问题。因此,在我的例子中,我的托管对象上下文的“配置”很糟糕。我的解决办法是创建自己的模拟对象。这很乏味,但我还没能可靠地工作。