使用 PromiseKit 对代码进行单元测试

Unit testing code with PromiseKit usage

我正在尝试测试对 Network.

具有依赖性的 Diary class

所以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

托管上下文的这种特定保存似乎有问题。它正在触发有关同步另一个托管上下文的通知。我们正在发现那里还有什么。

它在不同的问题中结束,与 PromiseKit 没有任何关系。

我们发现使用的内存量越来越大。 NSManagedObjectContextDidSaveNotification 在不同的商店协调器上产生了僵局。修复后测试开始按预期工作。