让我首先说明我仍然不熟悉我正在尝试做的事情,但努力做得更好!
我正在开发一个项目,我正在编写单元测试,但我遇到了如何处理问题的麻烦。
我正在测试的方法利用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。
答案 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