OCMock ios7中“NICE”“PARTIAL”和“MOCK”的区别

时间:2014-02-10 11:39:44

标签: ios ios7 ocmock

我正在学习iOS中的OCMock。可以有人让我知道“niceMockForClass”“partialMockForObject”和“mockForClass”方法之间的区别。如何以及何时使用所有这三个。我创建了一个名为“CustomClass”的自定义类。它有一个方法“verifySetUp”。现在,我需要测试一下吗?

-(void)testVerifyMethod {
    CustomClass *cc = [[CustomClass alloc] init];
    id mock = [OCMockObject partialMockForObject:cc];
    [[mock stub] verifySetUp];
    [mock verify];
}

将partialMockForObject更改为niceMockForClass或mockForClass时,会成功测试该方法。现在,我只想知道何时以及如何使用这三种方法。

如何在OCMock中为连接创建Mock以及如何使用它?

1 个答案:

答案 0 :(得分:9)

OCMock website上非常清楚地记录了所有这些功能。模拟iOS7与任何其他Objective-C代码相比没有什么特别之处。在您担心这些不同的模拟方法之间存在差异之前,您可能想要考虑为什么要进行模拟。

您想测试您的类,特别是一个名为" verifySetUp"的方法。问问自己,这种方法有什么作用?它接受了什么输入以及完成后的预期结果是什么?在您的测试中,直接调用此方法,然后断言您想要发生的事情发生。请查看STAssertXCTAssert,了解您的期望。

Mocking可让您在被测单元之外存根超出功能。假设您正在测试的方法调用另一个方法。您可能只想验证调用此方法,您可能想要伪造方法调用以返回您选择的数据,或者您可能只是想阻止该方法执行,因为它与测试无关。在这些情况下,您可以考虑使用模拟。

文档很好地介绍了这一点,但是当您希望模拟某些对象的方法但其他人使用其原始实现时partialMocks,当您关心每个方法时,通常会使用objectMocks与模拟对象的交互,以及niceMocks当您需要模拟对象的某些功能但又愿意对该对象进行其他调用时,除了不会失败之外什么都不做。

最后,我再也不知道' verifySetUp'确实如此,但它的名字暗示它本身就是一种考验。如果您打算为执行某些设置的方法编写测试覆盖率,您可能希望直接在测试中调用您的设置方法。

示例:

- (void)test_setUp_shouldStartEngine_andSetWidgetReadyStateToYes
{
    // Set up a mock to verify a method will be called by our method under test.
    id engineMock = [OCMock niceMockForClass:Engine.class];
    [[engineMock expect] start];

    // Create a real object that will be manipulated by our method under test.
    Widget *widget = [Widget new];

    // Do the work
    [AppController setUpEngine:engineMock widget:widget];

    // Verify the widget is ready
    XCTAssertTrue(widget.ready, @"Widget not ready");

    // Verify engine's start method was called
    [engineMock verify];
}

我希望这会有所帮助。快乐的单元测试;这是确保您的代码符合您的预期目的的绝佳方式!