Код модульного тестирования с использованием PromiseKit
Я пытаюсь проверить Diary
класс, который имеет зависимость от Network
,
Так Diary
код:
- (PMKPromise *)saveAndUploadToServer:(DiaryItem *)item
{
return [self save:item].then(^{
return [self upload:item]; << See UPDATE //I put breakpoint here, it is never called
});
}
- (PMKPromise *)save:(DiaryItem *)item
{
return [PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject) {
[self.entryCreationManagedContext performBlock:^{
BOOL success;
NSError *saveError = nil;
item.status = @(UploadingStatus);
success = [self.entryCreationManagedContext save:&saveError];
if (success) {
fulfill(item.objectID);
}
else {
reject(saveError);
}
}];
}];
}
- (PMKPromise*)upload:(DiaryItem*)item
{
return [self.network POST:self.diaryUrl parameters:[item dictionary]].then(^{
return [self reportUploadAnalytics];
});
}
И тест:
- (void)testFailedUploadingReportsAnalytics
{
XCTestExpectation *expectation = [self expectationWithDescription:@"Operations completed"];
[self uploadToServerAndReturnCallback].finally(^{
[expectation fulfill];
});
[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) {
assertThat(error, is(nilValue()));
//check that mock called
}];
}
Network
это макет в этом тесте. Но то, что я вижу, эта цепочка обещаний не выполняется. Это застряло. Может быть, потому, что then:
блок вызывается также в основном потоке XCTest
делает паузу Но в то же время это, вероятно, должно продолжаться через 5 секунд. В чем может быть проблема?
ОБНОВИТЬ
Похоже, это ничего не значит с моим первоначальным предположением. Если я заменю [self.entryCreationManagedContext save:&saveError]
с YES
затем отладка достигает точки останова.
ОБНОВЛЕНИЕ 2
Это похоже на проблему с этим конкретным сохранением управляемого контекста. Это вызывает уведомление о синхронизации другого управляемого контекста. И мы обнаруживаем, что еще там.
1 ответ
Это закончилось в другом выпуске и ничего не связано с PromiseKit.
Мы обнаружили растущее количество используемой памяти. Тот NSManagedObjectContextDidSaveNotification
производил тупик на разных координаторах магазина. После исправления, тесты начали работать как положено.