【发布时间】:2020-11-11 18:43:07
【问题描述】:
在异步测试中很常见,至少对我来说,必须知道期望的实现计数才能知道如何断言。
例如,检查这种情况的测试:
- 获取数据
- 收到第一个回调后,断言项目是否符合预期
- 获取下一页项目
- 断言项目是否符合预期
func testOne() {
let expectData = expectation(description: "data")
expectData.expectedFulfillmentCount = 2
var expectDataFulfillmentCount = 0
sut.data = {
expectData.fulfill()
expectDataFulfillmentCount += 1
if expectDataFulfillmentCount == 1 {
XCTAssertEqual(sut.numberOfItems, 3)
sut.fetchNextPage()
} else if expectDataFulfillmentCount == 2 {
XCTAssertEqual(sut.numberOfItems, 6)
}
}
sut.fetch()
waitForExpectations(timeout: 0.1, handler: nil)
}
我对这种模式不满意。我知道我可以通过以下方式稍微改变我的断言方式:
func testTwo() {
let expectFirstData = expectation(description: "firstData")
let expectSecondData = expectation(description: "secondData")
sut.data = {
if sut.numberOfItems == 3 {
expectFirstData.fulfill()
sut.fetchNextPage()
} else if sut.numberOfItems == 6 {
expectSecondData.fulfill()
}
}
sut.fetch()
wait(for: [expectFirstData, expectSecondData], timeout: 0.1, enforceOrder: true)
}
但我也不喜欢这样,因为我没有断言(没有XCTAssert),我只是在满足期望,然后失去了轻松识别测试失败的原因和位置的能力。不过,这种模式非常适合对布尔值的期望,例如:
func testThree() {
let truePerformingOperationExpect = expectation(description: "truePerformingOperationExpect")
let falsePerformingOperationExpect = expectation(description: "falsePerformingOperationExpect")
sut.performingOperation = { fetching in
if fetching {
truePerformingOperationExpect.fulfill()
} else {
falsePerformingOperationExpect.fulfill()
}
}
sut.fetch()
wait(for: [truePerformingOperationExpect, falsePerformingOperationExpect], timeout: 0.1, enforceOrder: true)
}
对我来说,如果我能得到一个期望的当前实现计数,这可以很容易地解决,它会清理测试很多,我会拥有两个最好的世界。可能吗?有没有其他方法可以做到这一点?
【问题讨论】:
标签: ios swift asynchronous testing xctest