我正在学习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以及如何使用它?
答案 0 :(得分:9)
OCMock website上非常清楚地记录了所有这些功能。模拟iOS7与任何其他Objective-C代码相比没有什么特别之处。在您担心这些不同的模拟方法之间存在差异之前,您可能想要考虑为什么要进行模拟。
您想测试您的类,特别是一个名为" verifySetUp"的方法。问问自己,这种方法有什么作用?它接受了什么输入以及完成后的预期结果是什么?在您的测试中,直接调用此方法,然后断言您想要发生的事情发生。请查看STAssert
或XCTAssert
,了解您的期望。
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];
}
我希望这会有所帮助。快乐的单元测试;这是确保您的代码符合您的预期目的的绝佳方式!