OCMock验证失败

时间:2016-03-11 05:37:43

标签: objective-c unit-testing ocmock

我正在尝试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的打印输出但是测试失败了。 我的测试中缺少什么?感谢

1 个答案:

答案 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);
}

注意:这不涉及任何模拟框架。我手工创建了一个部分模拟。在处理嘲笑(或部分嘲笑)时,我建议手动启动。一旦它变得单调乏味,那么一个模拟框架会让你更快。但是你会用你获得的知识写出更好的测试。