Ios 单元测试中xctestexpection实现方法调用的时间/位置是否正确?

Ios 单元测试中xctestexpection实现方法调用的时间/位置是否正确?,ios,unit-testing,xctest,xctestexpectation,Ios,Unit Testing,Xctest,Xctestexpectation,考虑以下单元测试: - (void)testSample { XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"]; [self.manager loadAllSuccess:^{ [expectation fulfill]; NSArray *data = [self.manager dataForIndex:0]; // C

考虑以下单元测试:

- (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]
调用放在块的底部,在
xctasertequal(44,data.count)
方法调用之后,测试按预期工作,直到我将值更正为10为止

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

根据

始终在异步过程结束时调用fulfill() 提前完成预期的回调可以设置一个竞赛 完成测试前运行循环可能退出的条件。如果 测试有多个期望值,除非每个期望值 Expection在中指定的超时内执行fulfill() waitForExpectationsWithTimeout()


刚找到这个-不确定它是否100%准确,因为我在别处看不到任何其他文档说明这一点。

是的,您应该只在您的期望得到满足时调用
emplify
。如果您希望在测试结束之前执行断言,则必须在执行断言之后才能满足您的期望

正如@Zach的回答所述,在成功/失败块完成之前,测试完全可能停止执行,因为测试等待的唯一事情是期望得到满足。成功和失败块在不知道测试的情况下执行。一旦实现了预期,测试执行将停止,任何进一步的代码都可能不会执行

您的代码在成功和失败的情况下都满足了预期,因此无论结果如何,这个测试似乎总是会通过的。我建议您将可以实现期望的地方限制在一个地方,这样您就可以知道当测试通过时哪些地方工作,当测试失败时哪些地方坏了,而无需进一步调试。您应该将此测试分为两部分,一部分在成功块中实现了预期,而在失败块中没有实现预期,另一部分在第二个测试中实现了预期。

在异步回调结束时始终调用fulfill(),提前满足预期可以设置一个竞争条件,在该条件下,运行循环可能会在完成测试之前退出。如果测试有多个期望,则除非每个期望在waitForExpectationsWithTimeout()中指定的超时内执行fulfill(),否则测试将不会通过。找到这个