0

方法代码如下:

- (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);
4

1 回答 1

1

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

一种方法是将它们传递进来。这是我通常会做的。然后我会制作一个更简单的版本,为生产代码提供默认对象。

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

因此,拆分这些职责可能会使事情更容易测试。

于 2017-01-16T05:10:00.743 回答