【问题标题】:How to know XCTestExpectation current fulfillment count如何知道 XCTestExpectation 当前的履行计数
【发布时间】:2020-11-11 18:43:07
【问题描述】:

在异步测试中很常见,至少对我来说,必须知道期望的实现计数才能知道如何断言。

例如,检查这种情况的测试:

  1. 获取数据
  2. 收到第一个回调后,断言项目是否符合预期
  3. 获取下一页项目
  4. 断言项目是否符合预期
    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


    【解决方案1】:

    我最终继承了XCTestExpectation

    class CountedFulfillmentTestExpectation: XCTestExpectation {
        private(set) var currentFulfillmentCount: Int = 0
    
        override func fulfill() {
            currentFulfillmentCount += 1
            super.fulfill()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 2014-09-30
      • 2016-10-04
      • 2019-12-28
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多