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

SuP*_*ter 5 unit-testing ios xctest swift

我\xe2\x80\x99m 在 swifts 中编写单元测试,并测试独特的工作流程。

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

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

    \n\n
    func failureDelegate(error: NSError!) {\n\nXCTAssertTrue(error.localizedDescription == \xe2\x80\x9cInvalid Credentials\xe2\x80\x9c)\n//Now that I\xe2\x80\x99ve verified correct error is returned, I need to reload objA\nmethodA(withCred:correctCredential) \n}\n\nfunc successDelegate(obj : ObjectA) {\n  XCTAssert(\xe2\x80\x9cObject is loaded\xe2\x80\x9d)\n  expectation.fulfill()\n}\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

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

\n\n
\n

API 违规 - 在已经处于等待模式时产生期望。

\n
\n\n

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

\n\n

谢谢!

\n

mat*_*ttt 4

不要共享expectation跨测试的实例。您应该在每个测试的主体中声明expectation(即 with ),而不是作为 的属性。如果您确实需要使用委托模式(闭包会更加简单且更加传统),您可以将其作为附加参数传递给您的委托方法。letXCTestCase