Код модульного тестирования с использованием 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 производил тупик на разных координаторах магазина. После исправления, тесты начали работать как положено.

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