使用 PromiseKit 进行单元测试代码

Posted

技术标签:

【中文标题】使用 PromiseKit 进行单元测试代码【英文标题】:Unit testing code with PromiseKit usage 【发布时间】:2015-01-13 11:07:50 【问题描述】:

我正在尝试测试依赖于NetworkDiary 类。

所以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:&amp;saveError] 替换为YES,则调试会到达断点。

更新 2

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 PromiseKit 进行单元测试代码的主要内容,如果未能解决你的问题,请参考以下文章

什么是单元测试?如何做好单元测试?

将 cout 和 stdout 都重定向到 C++ 中的字符串以进行单元测试

使用本机单元测试项目在 Visual Studio 2017 中对 C 代码进行单元测试

什么是持续集成的自动化测试

什么是持续集成的自动化测试

如何对 Excel VBA 代码进行单元测试