【问题标题】:XCTestExpectation - Calling an async method twice causes API violationXCTestExpectation - 两次调用异步方法会导致 API 冲突
【发布时间】:2015-02-06 11:44:22
【问题描述】:

我正在用 Swifts 编写单元测试,并测试一个独特的工作流程。

  1. 在 methodA() 中,我使用异步方法错误地加载了一个对象(比如使用不正确的凭据)。也开启期待

        func methodA(withCred credential: NSURLCredential) {
        var objA = ObjectA()
        // Set objA.a, objA.b, objA.c, 
        objA.credential = credential //Incorrect credential First time, Correct Credential second time 
        objA.delegate = self 
        expectation = expectationWithDescription(“Aync”)
        objA.callAsyncMethod() //This fires successDelegate() or failureDelegate()}
    
  2. 当 FailureDelegate() 被触发时,我重新加载对象,这次是正确的。为此,我需要再次调用 MethodA() (这样我就可以重用那里的所有其他东西)。

    func failureDelegate(error: NSError!) {
    
    XCTAssertTrue(error.localizedDescription == “Invalid Credentials“)
    //Now that I’ve verified correct error is returned, I need to reload objA
    methodA(withCred:correctCredential) 
    }
    
    func successDelegate(obj : ObjectA) {
      XCTAssert(“Object is loaded”)
      expectation.fulfill()
    }
    

3.这在方法A中再次启动了相同的期望,并导致以下错误:

API 违规 - 在等待模式下创建预期。

我了解 swift 不允许这样做。是否有解决方法或更好的方法来测试这些使用 XCTest 与 Swift 循环的异步方法?

谢谢!

【问题讨论】:

    标签: ios unit-testing swift xctest


    【解决方案1】:

    不要在测试之间共享 expectation 的实例。您应该在每个测试的正文中声明 expectation(即使用 let),而不是作为 XCTestCase 的属性。如果你真的需要使用委托模式(闭包会更简单、更传统),你可以将它作为附加参数传递给你的委托方法。

    【讨论】:

    • 谢谢,在这种情况下,无论expectation 是否是XCTestCase 上的属性,结果都保持不变。测试需要加载资源两次(调用异步方法两次),然后踢一样的期待。我可能会做一个 if 循环,但是对于数百个测试用例,我想知道是否有更优雅的解决方案。这是我正在测试的一个 SDK,我们正在逐渐走向区块——在此之前需要维护委托。
    • 您能帮我理解为什么不建议在XCTestCase 上将期望声明为属性吗?到目前为止,它似乎按预期工作,我想知道我是否遗漏了一些警告?
    • @SuPotter 将期望存储到属性将违反测试用例的隔离。想象一下,您在每个测试用例中都设置了 self.expectation 属性,但您忘记了一个。在这种情况下,您不能依赖编译器告诉您忘记设置期望值。
    【解决方案2】:

    我认为你的代码示例不完整,你能提供完整的代码吗?

    正如@mattt 所说,每个测试最好是唯一的,并且不应该重用其他测试变量。

    关于您的问题,您应该在触发waitForExpectationsWithTimeout:handler:之前先声明您的所有期望。在你开始等待另一个期望之后,你不能不创造一个新的期望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2020-01-12
      • 2023-04-07
      • 2014-09-29
      • 2017-09-01
      • 2019-12-29
      • 2020-10-12
      相关资源
      最近更新 更多