我正在使用第三方框架将数据发送到服务器。我正在嘲笑该第三方框架以隔离和测试我的代码如何与之交互。这是为了避免在单元测试时避免等待从网络取回数据,并且因为我想测试我编写的错误处理代码。
我没有使用 OCMock 或类似的东西,我正在通过子类化 3rd 方框架来编写自己的模拟对象。
我的方法看起来像这样-
- (void)loginWithCredentials:(NSDictionary *)credentials
{
NSDictionary *credentials = [self credentials];
NSString *username = [credentials objectForKey:kUserCredintialUsername];
NSString *password = [credentials objectForKey:kUserCredintialPassword];
[ThirdPartyClass loginWithUsername:username
andPassword:password
block:^(ThirdPartyClass *user, NSError *error){
if (user) {
NSLog(@"We logged in");
}
else if (error) {
NSLog(@"%@", [error errorString]);
}
}];
}
我想做的是loginWithUsername:andPassword:block:
在我的单元测试中调用我的模拟。当前的方法显然是不可测试的,因为它没有遵循“告诉,不要问”(我不是在告诉loginWithCredentials:
要调用哪个类loginWithUser...block:
)。我能想到解决这个问题的唯一方法是向我的实例或类添加一个类变量或添加一个参数,loginWithCredentials:
以便我可以替换我的模拟。生产代码这样做并没有获得任何清晰性 - 它已经被编写为 3rd 方库的适配器。相反,我更愿意尝试重构该loginWithCredentials:
方法。