iOS单元测试:测试是否调用KVO观察器

iOS单元测试:测试是否调用KVO观察器,ios,unit-testing,xctest,Ios,Unit Testing,Xctest,我有一个KVO场景测试,如下所示: - (void)testObserverCalled { __block BOOL executed = NO; [[RACObserve(model, dateText) skip:1] subscribeNext:^(id x) { executed = YES; }]; [model setDate:[NSDate date]]; XCTAssertTrue(executed); } XCAsse

我有一个KVO场景测试,如下所示:

- (void)testObserverCalled
{
    __block BOOL executed = NO;
    [[RACObserve(model, dateText) skip:1] subscribeNext:^(id x) {
        executed = YES;
    }];
    [model setDate:[NSDate date]];
    XCTAssertTrue(executed);
}
XCAssertCalledBeforeFunctionReturn()
目前我使用一个已执行的BOOL值来测试是否调用了观察器块,是否有更好的方法,比如在测试函数结束之前必须调用assert

像这样:

- (void)testObserverCalled
{
    __block BOOL executed = NO;
    [[RACObserve(model, dateText) skip:1] subscribeNext:^(id x) {
        executed = YES;
    }];
    [model setDate:[NSDate date]];
    XCTAssertTrue(executed);
}
XCAssertCalledBeforeFunctionReturn()
以便我可以将代码更改为:

- (void)testObserverCalled
{
    [[RACObserve(model, dateText) skip:1] subscribeNext:^(id x) {
        XCAssertCalledBeforeFunctionReturn()
    }];
    [model setDate:[NSDate date]];
}

您可以使用
xtestexpection
。有一个“手动”版本,您可以告诉它何时完成,但在这种情况下,您可能可以使用内置的
XCTestCase.keyValueObservingExpection(for:keyPath:handler:)
方法,该方法正好适合您的场景

所需示例代码的主要变化是,一旦您实现了预期,您需要在
setDate:
调用之后,通过在
waitforexpections(timeout:handler:)
中阻塞,告诉它等待多长时间才能得出事件永远不会发生的结论