如何为在自身内部实例化协作者的方法编写单元测试?

时间:2017-01-16 03:10:20

标签: ios unit-testing ocmockito

方法代码如下:

- (void)downloadSomething:(NSString *)url {
    Downloader *downloader = [[Downloader alloc] initWithUrl:url];
    NSData *data = [downloader download];
    FileCache *cache = [[FileCache alloc] initWithFile:@"download.cache"];
    cache.data = data;
    [cache save];
}

我想我应该模拟Downloader和FileCache来验证它是否运行良好。 我已经考虑过更改签名:downloadSomething:(NSString *)url downloader:(Downloader *)downloader cache:(FileCache *)cache,但在调用这些方法之前似乎需要做很多工作,这不是我想要的。

我正在使用ocmockito。

此外,是否有指南使编写代码更具可测性?

编辑:2017-01-16 14:54:23

这是一个好主意,写两个方法,如:

- (void)updateCacheWithUrl:(NSString *)url 
                downloader:(Downloader *)downloader 
                 fileCache:(FileCache *)fileCache; // for testing
- (void)updateCacheWithUrl:(NSString *)url; // call above method with (url, nil, nil);

1 个答案:

答案 0 :(得分:1)

在方法中实例化协作者时,会产生紧密耦合。测试这一难度导致我们探索其他设计。

一种方法是将它们传入。这就是我通常所做的事情。然后我会创建一个更简单的版本,为生产代码提供默认对象。

但是在你的例子中,url被传递给Downloader,这使得这更难。这表明downloadSomething:的当前设计违反了单一责任原则。它做了两件事:下载和缓存。

因此,分担这些责任可能会使事情变得更容易测试。