XCTestExpectation - 两次调用异步方法会导致API违规

时间:2014-12-08 18:26:04

标签: ios unit-testing swift xctest

我正在编写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. 3.这在methodA中再次启动相同的期望,并导致以下错误:

      

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

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

    谢谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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