XCTestExpectation的正确时间/位置是否在单元测试中完成方法调用?

时间:2017-02-16 01:32:34

标签: ios unit-testing xctest xctestexpectation

考虑以下单元测试:

- (void)testSample {
    XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"];

    [self.manager loadAllSuccess:^{
        [expectation fulfill];

        NSArray *data = [self.manager dataForIndex:0];

        // Correct count of data is 10, not 44 - this should fail.
        XCTAssertEqual(44, data.count);
    } failure:^(NSError *error) {
        [expectation fulfill];

        XCTFail(@"Error encountered");
    }];

    [self waitForExpectationsWithTimeout:60 handler:nil];
}

我遇到了已知失败案例的一些问题。尽管数据阵列中只有10个项目,但测试成功完成。

如果我将[expectation fulfill]调用放在块的底部,在XCTAssertEqual(44, data.count)方法调用之后,测试按预期工作并失败,直到我将值更正为10。

这是一个已知问题吗?我一直无法阅读文档,说我应该在最后一分钟打电话给你......

2 个答案:

答案 0 :(得分:2)

根据http://nshipster.com/xctestcase/

  

始终在异步结束时调用fulfill()   回调 - 提前完成期望可以建立一场比赛   运行循环可能在完成测试之前退出的条件。如果   测试有多个期望,除非每个都不会通过   expectation在指定的超时内执行fulfill()   waitForExpectationsWithTimeout()。

刚发现这个 - 不确定它是否100%准确,但因为我看不到任何其他文件在其他地方说明这一点。

答案 1 :(得分:0)

是的,只有满足您的期望时,才应致电fulfill。如果您希望在测试结束之前执行断言,则必须在断言执行后满足您的期望。

正如@Zach的回答所述,引用NSHipster,完成测试将在成功/失败块完成之前停止执行,因为测试唯一等待的是期望得到满足。成功和失败块正在执行而不知道测试。一旦满足期望,测试执行将停止,并且可能不会执行任何进一步的代码。

您的代码在成功和失败的情况下满足期望,因此无论结果如何,似乎该测试将始终通过。我建议你限制在一个地方可以满足期望的地方数量,这样你就可以知道测试通过时的工作情况以及失败时发生的故障,而无需进一步调试。您应该将此测试分为两个,一个是在成功块中满足期望而不是在失败块中,而在第二个测试中反之亦然。