【问题标题】:XCTestCase asyncXCTestCase 异步
【发布时间】:2018-09-06 04:49:59
【问题描述】:

我在场景中有 XCTestCase

在 XCTestCase 正文中,有一组测试用例。 我只希望所有测试用例在第一个测试用例成功完成后开始的问题(在我的特殊目的中,第一个测试用例响应一个 token 以供其他测试用例使用)。

我不想将参数 token 添加到其他测试用例中。

所以基本上,测试文件看起来像这样

class MyTestCase: XCTestCase {

    var token: String!

    override func setUp() {
        super.setUp()
        self.continueAfterFailure = false
    }

    func testGetToken() {
        asyncGetToken { token in
            self.token = token
            // From now, the test1 and test2 should be started.
        }
    }
    func test1() {
        //using token to make request etc
    }

    func test2() {
        //using token to make request etc
    }
}

有人建议简单的解决方案吗?

【问题讨论】:

  • 最好让测试彼此完全独立。这意味着一个测试的行为不应该依赖于另一个测试的结果,并且测试应该能够以任何顺序运行。
  • 如果所有测试都依赖于相同的初始状态并且testGetToken 所做的唯一事情就是设置该状态,那么您可以在测试用例的setUp 中执行此操作(等待异步结果在完成设置之前)。

标签: ios xctest xctestcase


【解决方案1】:

如 cmets 中所述,您应该将令牌检索移动到 setUp 方法中,这将允许在每次测试之前检索令牌,并保持您的测试彼此独立。

override func setUp() {
    super.setUp()
    self.continueAfterFailure = false

    let tokenExpectation = expectation(description: "get token")
    asyncGetToken { token in
        self.token = token
        tokenExpectation.fulfill()
    }
    let result = XCTWaiter().wait(for: [tokenExpectation], timeout: 5)
    XCTAssertEqual(result, .completed)
}

【讨论】:

  • 请注意,asyncGetToken 是异步的,setUp 很可能会在令牌被检索和分配之前完成。
  • 这种情况下可以使用XCTWaiter来延迟setUp的完成
  • 编辑加入服务员
  • 在主线程上观察到的异步作业需要预期,否则我们将陷入死锁。实际上,我已经这样做了,但我也希望它作为独立测试而不是嵌入到 setUp 函数中。无论如何,感谢您的帮助@Oletha
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多