我是OCMockObjects的新手,并试图模拟ACAccount类的实例方法:
-(NSArray *)accountsWithAccountType:(ACAccountType *)accountType;
我在测试类中编写了这个代码来初始化mockObject:
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
id mockAccountStore = [OCMockObject partialMockForObject:accountStore];
[[[mockAccountStore stub] andReturn:@[@"someArray"]] accountsWithAccountType:[OCMArg any]];
//call the test method
[myClassInstance methodToTest];
在myClass中,methodToTest如下所示:
-(void) methodToTest
{
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType* accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSArray* expectedArray = [accountStore accountsWithAccountType:accountType];
//Getting nil value to Array rather than the returned value in stub
}
知道我在这里做错了什么。感谢。
答案 0 :(得分:1)
Ben Flynn是正确的,您需要一种方法将AccountStore
注入您正在测试的对象中。另外两种方法:
1)使accountStore
成为初始化时设置的测试类的属性,然后在测试中使用mock覆盖该属性。
2)创建一个像-(ACAccountStore *)accountStore
这样的方法来初始化帐户商店,但是在你的测试模拟该方法:
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
id mockAccountStore = [OCMockObject partialMockForObject:accountStore];
[[[mockAccountStore stub] andReturn:@[@"someArray"]] accountsWithAccountType:[OCMArg any]];
id mockInstance = [OCMockObject partialMockForObject:myClassInstance];
[[[mockInstance stub] andReturn:mockAccountStore] accountStore];
// call the test method
[myClassInstance methodToTest];
答案 1 :(得分:0)
您正在创建模拟,但您正在测试的方法不使用模拟,它使用的是原始ACAccountStore类的实例。
如果您愿意,使methodToTest
可测试的最简单方法是让它接受ACAccountStore的实例作为参数。
- (void)methodToTestWithAccountStore:(ACAccountStore *)accountStore;
然后你的测试看起来像这样:
[myClassInstance methodToTest:mockAccountStore];
这将遵循依赖注入模式。如果您不喜欢这种模式,那么可以模拟ACAccountStore的alloc
方法来返回您的模拟对象,但我总是对模拟{{1}的可能副作用持谨慎态度而建议为ACAccountStore创建一个工厂:
alloc
如果使用此模式,则可以模拟工厂方法。