Use XCTestExpectation
to wait for asynchronous processes, for example:
func testExample() {
let e = expectation(description: "Alamofire")
Alamofire.request(urlString)
.response { response in
XCTAssertNil(response.error, "Whoops, error (response.error!.localizedDescription)")
XCTAssertNotNil(response, "No response")
XCTAssertEqual(response.response?.statusCode ?? 0, 200, "Status code not 200")
e.fulfill()
}
waitForExpectations(timeout: 5.0, handler: nil)
}
In your case, if you're going to test your asynchronous method, you have to provide a completion handler to refreshThingy
:
class Thingy {
var property: String!
func refreshThingy(completionHandler: ((String?) -> Void)?) {
Alamofire.request(someURL)
.responseJSON { response in
if let json = response.result.value as? [String: String] {
completionHandler?(json["JSON"])
} else {
completionHandler?(nil)
}
}
}
}
Then you can test Thingy
:
func testThingy() {
let e = expectation(description: "Thingy")
let thingy = Thingy()
thingy.refreshThingy { string in
XCTAssertNotNil(string, "Expected non-nil string")
e.fulfill()
}
waitForExpectations(timeout: 5.0, handler: nil)
}
Frankly, this pattern of using a completion handler is probably something that you want in your refreshThingy
, anyway, but I made it optional in case you might not want to supply a completion handler.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…