2015-07-28 3 views
0

Я использую Kiwi для выполнения асинхронного тестирования. Один тест проверяет, что после запрошенного сетевого запроса ответ от сети записывается на диск. Оба запрос сети и запись ответа на диск выполняется на фоне очередях:Как я могу дождаться завершения асинхронных тестов Kiwi или запустить код после их выполнения?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    [[HZMediationAPIClient sharedClient] GET:@"start" parameters:nil success:^(HZAFHTTPRequestOperation *operation, NSDictionary *json) { 

     // store JSON to disk 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
      [json writeToURL:[[self class] pathToStartInfo] atomically:YES]; 
     }); 

     [self.delegate startWithDictionary:json fromCache:NO]; 

    } failure:^(HZAFHTTPRequestOperation *operation, NSError *error) { 

    }]; 
}); 

я могу проверить такие вещи, как делегат, получающего метод startWithDicationary:fromCache, используя возможности асинхронного тестирования Киви:

[[expectFutureValue(starterMock) shouldEventually] receive:@selector(startWithDictionary:fromCache:) withArguments:json,theValue(NO)]; 

Однако я Не уверен, как проверить правильность записи данных на диск. Я могу сделать что-то вроде послать метод делегата, когда после того, как данные записываются на диск, а затем проверить, что это произойдет:

[[expectFutureValue(starterMock) shouldEventually] receive:@selector(wroteDictionaryToCache)]; 

Но даже если я проверить, что сообщение отправлено, я не могу проверить, что данные фактически записывается на диск.

it(@"Returns the data from network when no cached value, then updates the cache", ^{ 
    // ... test setup here 

    [[expectFutureValue(starterMock) shouldEventually] receive:@selector(wroteDictionaryToCache)]; // This code finishes immediately 
    // Code here checking if the data has been written to disk will be executed before the above expectations become true. 
}); 

Есть ли способ, что я могу ждать асинхронных ожиданий годен/не годен, так что я могу затем проверить, что данные записываются на диск? Или я могу приложить блок завершения к ожиданиям, чтобы я мог писать будущие тесты, когда эти ожидания async проходят/терпят неудачу?

Если у вас есть альтернативный подход к тестированию этого, это будет хорошо.

ответ

0

Я не придумал способ выполнить именно это, но я пришел к выводу, что для тестирования лучше было перевести логику кэширования в отдельный объект и сделать его зависимым от класса, который я тестировал. Интерфейс для этого выглядит следующим образом:

@interface HZCachingService : NSObject 

- (void)cacheDictionary:(NSDictionary *)dictionary filename:(NSString *)filename; 
- (NSDictionary *)dictionaryWithFilename:(NSString *)filename; 

@end 

Я просто передать этот объект к классу я тестирую в методе init. В тестах я блокирую этот объект и проверяю, что на него вызывается cacheDictionary:filename: с правильными аргументами.

Я тестирую фактическое поведение записи на диск HZCachingService в отдельной спецификации.