Как написать модульный тест для метода, который создает коллабораторов внутри себя?
Код метода выглядит так:
- (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 ответ
Когда коллаборатор создается внутри метода, это создает тесную связь. Сложность тестирования этого приводит нас к исследованию других конструкций.
Один из способов - передать их. Это то, что я обычно делаю. Тогда я бы сделал более простую версию, которая предоставляет объекты по умолчанию для производственного кода.
Но в вашем примере url
передается в Downloader
, что делает это сложнее. Это говорит о том, что нынешний дизайн downloadSomething:
нарушает принцип единой ответственности. Это делает две вещи: загрузка и кэширование.
Поэтому разделение этих обязанностей, вероятно, облегчит тестирование.