我正在编写swifts中的单元测试,并测试一个独特的工作流程。
在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()}
当触发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.这在methodA中再次启动相同的期望,并导致以下错误:
API违规 - 在等待模式下创建期望。
据我所知,swift不允许这样做。是否有一种解决方法或更好的方法来测试使用XCTest使用Swift循环的这些异步方法?
谢谢!
答案 0 :(得分:2)
不要跨测试共享expectation
的实例。您应该在每个测试的正文中声明expectation
(即使用let
),而不是XCTestCase
上的属性。如果你真的需要使用委托模式(闭包会更多,更简单和更传统),你可以将它作为附加参数传递给你的委托方法。
答案 1 :(得分:0)
我认为你的代码例子不完整,你能提供完整的代码吗?
正如@mattt所说,每个测试最好是唯一的,不应该重用其他测试变量。
关于您的问题,您应该在触发waitForExpectationsWithTimeout:handler:
之前先声明所有期望。在您开始等待另一个之后,您无法创造新的期望。