进行单元测试等待另一个方法内的异步调用

时间:2017-06-03 12:46:11

标签: ios swift unit-testing xctest

我正在测试我的所有数据是否已在UIViewController UITableView中正确加载。

加载数据并填充表格的代码位于myMethod()内,并且是异步调用。

func myMethod() {
    reloadModel { ... wait for async callback ... }
}

在我的测试用例中,我正在调用myMethod(),但我不知道如何等待异步调用完成。

//Test Code
func testLoadData() {
        let listVC = ListViewController.init(tableView:tableView)
        listVC .myMethod()
         ... here it should wait for the async call...
        XCTAssertEqual(...)
}

1 个答案:

答案 0 :(得分:2)

问题是你试图测试太多。您对myMethod()的测试不应断言数据已被提取(您不应该在单元测试中进行网络连接)。它应该测试视图控制器在其数据获取器助手上调用正确的方法。这意味着你需要在那里创建一个接缝,然后模拟出那个fetcher对象。

然后在你的视图控制器测试中没有等待;你只是声称myMethod()触发了对模拟的pleaseGoGetMyData()的调用。

然后分别测试数据获取器,再次模拟其对网络堆栈的依赖性,以便您需要测试的只是提取器发出正确的请求并且它将正确的(虚拟)数据返回给它的客户端。 / p>

如果不这样做,要进行异步测试,您需要使用XCTestExpectation。有关示例,请参阅EridB's answer to a related question