【问题标题】:iphone OCMockObject and unit-testing a class that inherits from NSURLConnectioniphone OCMockObject 和单元测试从 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

【问题讨论】:

    标签: iphone objective-c ocmock


    【解决方案1】:

    如果您将mockForClass 更改为niceMockForClass,您将获得一个存根对象,该对象会静默忽略您不关心的消息,但您仍然可以为您关心的调用设置期望值:

    id urlRequest = [OCMockObject niceMockForClass:[NSURLRequest class]];
    

    【讨论】:

      【解决方案2】:

      您的包装器正在调用真实的东西:[super initWithRequest ...],而 NSURLRequest 正在调用一些您尚未设置期望的方法 _CFURLRequest。由于您正在制作包装器,因此您正在“存根” NSURLConnection 而不是“模拟”它。而且你可能不想接触真实的物体。您可以使您的包装器实现您的被测单元将调用的任何方法并在其中执行断言。由于您没有从 NSURLConnection 中创建 OCMockObject,因此您不能使用验证方法。

      我对在 Objective-C 中模拟还是个新手,所以我还没有模拟 NSURLConnection 的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多