如何知道 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 不会等待给定的时间

等待带有完成处理程序的*特定*(单个)XCTestExpectation?

使用 XCTestExpectation 对异步函数进行单元测试,但它不会等待我设置的秒数

如何测试一个对象将在拆卸后被释放

强制 Alamofire 在主线程上做所有事情?

使用 XCTest 进行异步方法测试