Home > OS >  Use of waitForExpectations Crash SwiftUI
Use of waitForExpectations Crash SwiftUI

Time:12-06

I'm running a UI test where I need to test an firebase phone authentication function using the waitForExpectations API. Currently i'm using two waitForExpectations, In the first command working fine but in second command the Code goes to crash.

Code:-

func testsendOTPAndVerify() {
    let expection = expectation(description: "OTP Send With Correct Number")
    let signupClassMthd = SignupScreen(phoneNumber: .constant("9814012345"))
    signupClassMthd.verify { response, verificationId in
        XCTAssert(response == true)
        if response {
            expection.fulfill()
            self.testVerifyOTP(verificationID: verificationId)
        }
    }
    self.waitForExpectations(timeout: 30) { respoError  in
        if let errors =  respoError {
            print("OTP Send ",errors.localizedDescription)
        }
    }
}


func testVerifyOTP(verificationID:String){
    let expection = expectation(description: "Check OTP")
    let verfyClassTest = VerficationCode(phoneNumber: .constant(CommonAllString.BlankStr), verificationID: .constant(verificationID))
    verfyClassTest.verifyPhoneNumberAndLogin(OtpEndrdCode: "000000") { response, responseBool in
        if response == true && responseBool == false {
            expection.fulfill()
        }
        XCTAssert(response == true && responseBool == false)
    }
    self.waitForExpectations(timeout: 30) { respoError  in
        if let errors =  respoError {
            print("Check OTP = ",errors.localizedDescription)
        }
    }
}

Code ScreenShot:-

ScreenShot

Error:-

Thread 1: "Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'API violation - calling wait on test case while already waiting.'"

CodePudding user response:

You're already scheduling a wait on testVerifyOTP(), Remove the one used at the verify function:

func testsendOTPAndVerify() {
    let expection = expectation(description: "OTP Send With Correct Number")
    let signupClassMthd = SignupScreen(phoneNumber: .constant("9814012345"))
    signupClassMthd.verify { response, verificationId in
        XCTAssert(response == true)
        if response {
            expection.fulfill()
            self.testVerifyOTP(verificationID: verificationId)
        }
    }
    self.waitForExpectations(timeout: 30) { respoError  in
        if let errors =  respoError {
            print("OTP Send ",errors.localizedDescription)
        }
    }
}


func testVerifyOTP(verificationID:String){
    let expection = expectation(description: "Check OTP")
    let verfyClassTest = VerficationCode(phoneNumber: .constant(CommonAllString.BlankStr), verificationID: .constant(verificationID))
    verfyClassTest.verifyPhoneNumberAndLogin(OtpEndrdCode: "000000") { response, responseBool in
        if response == true && responseBool == false {
            expection.fulfill()
        }
        XCTAssert(response == true && responseBool == false)
    }
}

CodePudding user response:

Declare in the class not in the function.

Code:-

let signInVerifyUsrExpc = XCTestExpectation(description: "signInVerifyUsrExpc")

func testsendOTPAndVerify() {
    signInVerifyUsrExpc.expectedFulfillmentCount = 2
    let signupClassMthd = SignupScreen(phoneNumber: .constant("9814012345"))
    signupClassMthd.verify { response, verificationId in
        XCTAssert(response == true)
        if response {
            self.testVerifyOTP(verificationID: verificationId)
            self.signInVerifyUsrExpc.fulfill()
        }
    }
    wait(for: [signInVerifyUsrExpc], timeout: 100.0)
}


func testVerifyOTP(verificationID:String){
    let verfyClassTest = VerficationCode(phoneNumber: .constant(CommonAllString.BlankStr), verificationID: .constant(verificationID))
    verfyClassTest.verifyPhoneNumberAndLogin(OtpEndrdCode: "000000") { response, responseBool in
        if response == true && responseBool == false {
            self.signInVerifyUsrExpc.fulfill()
        }
        XCTAssert(response == true && responseBool == false)
    }
}
  • Related