iOS单元测试:测试是否调用KVO观察器
我有一个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
- (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:)
中阻塞,告诉它等待多长时间才能得出事件永远不会发生的结论