我正在尝试使用OCMock为AFNetworking的AFHTTPRequestOperationManager创建一个模拟
这就是我所拥有的:
id mockRequestManager = OCMClassMock([AFHTTPRequestOperationManager class]);
OCMStub([mockRequestManager manager]).andReturn(mockRequestManager);
[myObject methodThatUsesAFHTTPRequestOperationManager];
我之前已经为其他单身人士(例如[NSNotificationCenter defaultCenter]
)完成了这件事,但是使用AFHTTPRequestOperationManager时,我从[AFHTTPRequestOperationManager manager]
调用[myObject methodThatUsesAFHTTPRequestOperationManager]
时没有收回模拟对象}。我总是回到AFHTTPRequestOperationManager实例对象。
我错过了什么吗?是否有AFHTTPRequestOperationManager的一些实现细节阻止它工作?
修改
因此,在查看AFHTTPRequestOperationManager代码之后,事实证明它实际上不是单例,只是一个返回新AFHTTPRequestOperationManager对象的类方法。但是,我仍然不明白为什么简化类方法不会返回我的模拟对象而不是创建一个新对象。
答案 0 :(得分:0)
正如你所说的不是单身人士。你可以注入它;看看this answer。
使用注射优于单身。如果您不想注入像[NSNotificationCenter defaultCenter]
[NSUserDefaults standardUserDefaults]
{{1}}这样的典型对象,而不是模拟和存根共享实例访问者,只需使用测试中的真实对象即可。例如,您可以在测试中收听该通知,而不是测试您是否发布了模拟defaulCenter的特定通知。我更喜欢这个解决方案,因为它避免使用模拟,我们可以说这更可靠,因为您正在测试您的对象与真实的通知中心。有些人可能会说,测试将是一次集成测试,但IMO在这种情况下不值得区别。
关于存根共享实例访问器,我不习惯新的OCMock语法,但不应该有问题,请查看如何使用OCMock存根类方法。