我正在尝试OCMock来测试是否在viewDidLoad上调用了fetchContactsOnLoad方法。下面的VC代码。
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%s", __FUNCTION__);
[self fetchContactsOnLoad];
}
-(void)fetchContactsOnLoad {
NSLog(@"%s", __FUNCTION__);
[self.output doSomething:[ContactListRequest new]];
}
以下测试。
- (void)testFetchContactsOnLoadInvoked {
id vcMock = OCMClassMock([ContactListViewController class]);
[vcMock view];
OCMVerify([vcMock fetchContactsOnLoad]);
}
当我运行测试时会调用该方法,因为我可以看到NSLog的打印输出但是测试失败了。 我的测试中缺少什么?感谢
答案 0 :(得分:0)
首先,让我试着劝你试图测试fetchContactsOnLoad
是否被调用。最好测试调用fetchContactsOnLoad
的结果。
那就是说,让我们继续吧。你怎么测试fetchContactsOnLoad
被叫?这被称为“部分模拟”,因为你只是嘲笑对象的部分,但是想要保留其他所有内容。 (同样,这通常是一个坏主意。但它对遗留代码来说很方便。)
我将采用遗留测试技术Subclass和Override Method。在我的测试代码中,我将创建一个特殊的子类:
@interface TestableContactListViewController : ContactListViewController
@property (nonatomic, assign) NSUInteger fetchContactsOnLoadCount;
@end
@implementation TestableContactListViewController
- (void)fetchContactsOnLoad {
self.fetchContactsOnLoadCount += 1;
}
@end
有了这个,测试将如下所示:
- (void)testLoadingView_ShouldInvokeFetchContactsOnLoad {
TestableContactListViewController *sut = [[TestableContactListViewController alloc] init];
[sut view];
XCTAssertEquals(sut.fetchContactsOnLoadCount, 1);
}
注意:这不涉及任何模拟框架。我手工创建了一个部分模拟。在处理嘲笑(或部分嘲笑)时,我建议手动启动。一旦它变得单调乏味,那么一个模拟框架会让你更快。但是你会用你获得的知识写出更好的测试。