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 继承的类的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 命令行单元测试(和文件 I/O)

如何为 iPhone 应用程序运行和调试单元测试

使用 XCode 3 对 iPhone 静态库进行单元测试

为 iPhone / iPad 编写单元测试的最佳方法是啥?

iPhone 验收/单元测试

Iphone 单元测试错误:权限被谷歌工具箱拒绝