Как написать модульный тест для метода, который создает коллабораторов внутри себя?

Код метода выглядит так:

- (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: нарушает принцип единой ответственности. Это делает две вещи: загрузка и кэширование.

Поэтому разделение этих обязанностей, вероятно, облегчит тестирование.

Другие вопросы по тегам