为什么OCMClassMock没有创建模拟对象?

时间:2016-05-17 12:45:19

标签: ios objective-c unit-testing ocmock

我把问题变成了简单的版本。我想模仿NSDictionary。

在我的测试课中,我用这种方式嘲笑NSDictionary:

NSDictionary* mockDict = OCMClassMock([NSDictionary class]);
OCMStub([mockDict objectForKey:@"account_type"]).andReturn(@"Mock ACC1 account_type");
OCMStub([mockDict objectForKey:@"account_number"]).andReturn(@"Mock ACC1 account_number");

现在我用这种方式点击了真正的代码:

首先,我创建了一个VC的实例。

CTRegisterPIckAccountViewController *_sutVC;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle bundleForClass:[self class]]];
_sutVC = (CTRegisterPIckAccountViewController *)[storyboard instantiateViewControllerWithIdentifier:@"AccountListViewController"];

然后我打电话给

[_sutVC tableView:mockTableView cellForRowAtIndexPath:mockIndexNotSelected];

在这个VC中,我在界面中使用了UITableViewDelegate,我调用了这个函数:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSDictionary *account = [_accounts objectAtIndex:indexPath.row];
    NSString *Tmp = [account objectForKey:@"account_type"];

}

但是当我提出突破点时。 mockDict的实例仅存在于测试类中。我得到了Nil。我的期望是

[account objectForKey:@"account_type"]

这必须返回我上面的字符串值,但返回nil。

1 个答案:

答案 0 :(得分:0)

一般来说,创建一个模拟对象并不会让它无处不在。您需要使用某种形式的Dependency Injection。最常见的DI形式是将对象作为参数传递给初始化程序,或将其设置为属性。

对于OCMock,模拟类方法是一个例外:它确实调用了类方法的所有用法。但不是实例方法。