Я пытаюсь проверить класс Diary
, который имеет зависимость от Network
.Код модуля тестирования с использованием PromiseKit
Так 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 секунд. Что может быть проблемой?
UPDATE
Похоже, ничего с моим оригинальным предположением. Если я заменил [self.entryCreationManagedContext save:&saveError]
на YES
, тогда отладка достигнет точки останова.
UPDATE 2
Похоже, вопрос с этой конкретной экономии управляемого контекста. Он запускает уведомление о синхронизации других управляемых контекстов. И мы обнаруживаем, что еще там.