OCMockObject模拟实例方法

时间:2014-03-27 12:56:49

标签: ios ocmock xctest

我是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
}

知道我在这里做错了什么。感谢。

2 个答案:

答案 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

如果使用此模式,则可以模拟工厂方法。