iphone OCMockObject 和单元测试从 NSURLConnection 继承的类
Posted
技术标签:
【中文标题】iphone OCMockObject 和单元测试从 NSURLConnection 继承的类【英文标题】:iphone OCMockObject and unit-testing a class that inherits from NSURLConnection 【发布时间】:2009-12-31 01:51:03 【问题描述】:我想对继承自 NSURLConnection 的类的自定义 init 方法进行单元测试——如果我的可测试类的 init 调用 NSURLConnection's initWithRequest
,我该怎么做?
我正在使用 OCMock,通常我可以模拟包含在我的测试类中的对象。对于这种继承场景,最好的方法是什么?
- (void)testInit
id urlRequest = [OCMockObject mockForClass:[NSURLRequest class]];
MyURLConnectionWrapper *conn = [[MyURLConnectionWrapper alloc]
initWithRequest:urlRequest delegate:self
someData:extraneousData];
我的类是这样实现的:
@interface MyURLConnectionWrapper : NSURLConnection
- (id)initWithRequest:(NSURLRequest *)request
delegate:(id)delegate someData:(NSString *)fooData
@end
@implementation MyURLConnectionWrapper
- (id)initWithRequest:(NSURLRequest *)request
delegate:(id)delegate someData:(NSString *)fooData
if (self = [super initWithRequest:request delegate:delegate])
// do some additional work here
return self;
这是我得到的错误:
OCMockObject[NSURLRequest]:意外 调用的方法:_CFURLRequest
【问题讨论】:
【参考方案1】:如果您将mockForClass
更改为niceMockForClass
,您将获得一个存根对象,该对象会静默忽略您不关心的消息,但您仍然可以为您关心的调用设置期望值:
id urlRequest = [OCMockObject niceMockForClass:[NSURLRequest class]];
【讨论】:
【参考方案2】:您的包装器正在调用真实的东西:[super initWithRequest ...],而 NSURLRequest 正在调用一些您尚未设置期望的方法 _CFURLRequest。由于您正在制作包装器,因此您正在“存根” NSURLConnection 而不是“模拟”它。而且你可能不想接触真实的物体。您可以使您的包装器实现您的被测单元将调用的任何方法并在其中执行断言。由于您没有从 NSURLConnection 中创建 OCMockObject,因此您不能使用验证方法。
我对在 Objective-C 中模拟还是个新手,所以我还没有模拟 NSURLConnection 的方法。
【讨论】:
以上是关于iphone OCMockObject 和单元测试从 NSURLConnection 继承的类的主要内容,如果未能解决你的问题,请参考以下文章