如何知道 XCTestExpectation 当前的履行计数
Posted
技术标签:
【中文标题】如何知道 XCTestExpectation 当前的履行计数【英文标题】:How to know XCTestExpectation current fulfillment count 【发布时间】: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)
对我来说,如果我能得到一个期望的当前实现计数,这可以很容易地解决,它会清理测试很多,我会拥有两个最好的世界。可能吗?有没有其他方法可以做到这一点?
【问题讨论】:
【参考方案1】:我最终继承了XCTestExpectation
:
class CountedFulfillmentTestExpectation: XCTestExpectation
private(set) var currentFulfillmentCount: Int = 0
override func fulfill()
currentFulfillmentCount += 1
super.fulfill()
【讨论】:
以上是关于如何知道 XCTestExpectation 当前的履行计数的主要内容,如果未能解决你的问题,请参考以下文章
等待带有完成处理程序的*特定*(单个)XCTestExpectation?