单元测试在Swift中使用REST调用的方法

时间:2016-09-22 14:27:16

标签: json swift rest unit-testing

让我首先说明我仍然不熟悉我正在尝试做的事情,但努力做得更好!

我正在开发一个项目,我正在编写单元测试,但我遇到了如何处理问题的麻烦。

我正在测试的方法利用RESTAPI调用来验证用户凭据。我不确定单元测试的最佳方法是什么。

这是我想要进行单元测试的方法:

@IBAction func loginBtnActivate(sender: UIButton) {
    let enteredEmail: String = emailField.text!
    let enteredPassword: String = passwordField.text!
    let testInfo:[String: AnyObject] = ["User": enteredEmail, "Password": enteredPassword]
    RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in
        if statusCode == 200 {
            let AuthToken: TokenObject = (TokenObject(json: json))
            try! self.keychain.set(AuthToken.Authorization, key:"Authorization")
            try! self.keychain.set(AuthToken.LifeTime, key: "LifeTime")
            try! self.keychain.set(AuthToken.UUID, key: "UUID")
             NSOperationQueue.mainQueue().addOperationWithBlock {
                self.performSegueWithIdentifier("loginToMyHealth", sender: nil)
            }
        } else if statusCode == 401 {
            self.incorrectLoginAlert()
        } else if statusCode == 503 {
            print("Service Unavailable Please Try Again Later")
        }
    }
}

这是我正在采取的方法:

 func testLoginInfoMatchesDataOnServer(){
    let enteredEmail: String = "user"
    let enteredPassword: String = "password"
    let testInfo:[String: AnyObject] = ["User": enteredEmail, "Password": enteredPassword]
    RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in
    XCTAssert(statusCode == 200, "statusCode is not matching the server data")
}

我只是在验证Rest调用是否成功以及凭据是否与JSON匹配。 XCTAssert调用似乎无法正常工作。无论我把第一个参数放在哪里,XCTAssert都不会影响测试是否成功。

示例,如果我把:

XCTAssert(false, "statusCode is not matching the server data")

无论我放什么,测试仍然会通过。如果我将Assert函数放在括号之外,那么变量“statusCode”就会超出范围,所以我坚持使用

  

使用未解析的标识符'statusCode'。

   func testLoginInfoMatchesDataOnServer(){
let enteredEmail: String = "user"
let enteredPassword: String = "password"
let testInfo:[String: AnyObject] = ["User": enteredEmail, "Password": enteredPassword]
RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in
}
XCTAssert(statusCode == 200, "statusCode is not matching the server data")
}

我正在看这本指南以寻求帮助。这对于我正在尝试做的事情会更好吗?

http://roadfiresoftware.com/2016/06/how-do-you-unit-test-rest-calls-in-swift/

我对某些核心概念的理解可能完全不对,所以我非常感谢你的建议!

提前致谢!

Sean W。

1 个答案:

答案 0 :(得分:5)

您的代码首先出现问题

function test(){    
    RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in

    }//PostLogin call ends
    XCTAssert(statusCode == 200, "statusCode is not matching the server data") // Here StatusCode is not accessible as outside the block
}// end function

如果您想使用状态代码,您应该

function test(){    
    RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in
        XCTAssert(statusCode == 200, "statusCode is not matching the server data") // Here StatusCode is accessible inside the block
    }//PostLogin call ends
}// end function

但是这会失败,因为你需要等待响应。这可以使用

完成
  

waitForExpectationsWithTimeout(5)

调用它的正确方法是 -

function test(){    
    let URL = NSURL(string: "http://google.com/")!
    let expectation = expectationWithDescription("GET \(URL)")
    RestApiManager.sharedInstance.postLogin(testInfo) { (json, statusCode) in
        XCTAssert(statusCode == 200, "statusCode is not matching the server data") // Here StatusCode is accessible inside the block
        expectation.fulfill()
    }//PostLogin call ends
    waitForExpectationsWithTimeout(5){ error in 
        if let error = error {
            print("Error: \(error.localizedDescription)")
        }
    }//Wait block end
}// end function

这里的重要部分是

  

expectation.fulfill()//告诉进程完成

  

waitForExpectationsWithTimeout(5){} //告诉等待5secs或抛出错误

了解更多info