iOS 单元测试:测试是不是调用了一个 KVO 观察者

Posted

技术标签:

【中文标题】iOS 单元测试:测试是不是调用了一个 KVO 观察者【英文标题】:iOS unit test: test that an KVO observer is callediOS 单元测试:测试是否调用了一个 KVO 观察者 【发布时间】:2015-05-06 03:34:38 【问题描述】:

我有一个这样的 KVO 场景测试:

- (void)testObserverCalled

    __block BOOL executed = NO;
    [[RACObserve(model, dateText) skip:1] subscribeNext:^(id x) 
        executed = YES;
    ];
    [model setDate:[NSDate date]];
    XCTAssertTrue(executed);

目前我使用执行的 BOOL 值来测试是否调用了观察者块,有没有更好的方法,例如必须在测试函数结束之前调用的断言?

像这样:

XCAssertCalledBeforeFunctionReturn()

这样我就可以将代码更改为:

- (void)testObserverCalled

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

【问题讨论】:

【参考方案1】:

您可以使用XCTestExpectation。有一个“手动”版本,您可以在它何时完成时告诉它,但对于这种情况,您可以使用专门针对您的场景的内置 XCTestCase.keyValueObservingExpectation(for:keyPath:handler:) 方法。

你想要的示例代码的主要变化是,一旦你坚持了期望,你需要告诉它等待多长时间才能得出结论,在你的@之后阻止waitForExpectations(timeout:handler:),事件永远不会发生987654324@电话。

【讨论】:

以上是关于iOS 单元测试:测试是不是调用了一个 KVO 观察者的主要内容,如果未能解决你的问题,请参考以下文章

涉及 NSDocumentDirectory 和其他 iOS App 特定调用的静态库的单元测试

如何检查是不是在单元测试中调用了 sync.WaitGroup.Done()

在 ios6 上运行单元测试是不是有意义

KVO你所不知道的"坑"

在单元测试中同步调用异步方法是不是不正确?

自定义 UITableViewCell 的 iOS 单元测试