3

我正在尝试将 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

4 回答 4

4

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

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

不幸的是,这个错误影响了 OCMock,Apple 对修复它并没有表现出太大的兴趣。许多人提交了错误报告,但无济于事。

我意识到这不太舒服,但是在使用Cedar进行测试时,您会得到更好的错误消息(我相信GTM也是如此)。

于 2010-11-13T21:34:55.380 回答
2

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

于 2010-09-01T19:46:59.883 回答
2

我发现这个错误在 2011 年 4 月的 Xcode 4/SDK 4.3 中仍然存在。例如,测试 A 通过,测试 B 使测试台崩溃。

测试一:

- (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 回答
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

于 2014-04-29T06:00:57.827 回答