我把问题变成了简单的版本。我想模仿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。
答案 0 :(得分:0)
一般来说,创建一个模拟对象并不会让它无处不在。您需要使用某种形式的Dependency Injection。最常见的DI形式是将对象作为参数传递给初始化程序,或将其设置为属性。
对于OCMock,模拟类方法是一个例外:它确实调用了类方法的所有用法。但不是实例方法。