@mattt による回答を待って、コードの例を投稿します。
Client
簡単な Web サービスの呼び出しを担当するクラスがあるとします。このクラスはuserSignIn
、WS を使用してサインインを実行する関数を実装します。
これはuserSignIn
関数のコードです:
func userSignIn(
#email:String,
password:String,
completionHandler: (Bool, String?, NSError?) -> Void
)-> Void
{
var parameters:[String:AnyObject] = [
"email":email,
"password":password,
]
Alamofire.request(.POST, Client.urlPath, parameters: parameters, encoding: ParameterEncoding.JSON).responseJSON {
(request, response, JSON, responseError) -> Void in
// Setup callback params
// HERE WE INJECT THE "FAKE" DATA--------
var operationComplete = false
var accessToken:String?
var error:NSError?
// --------------------------------------
if let statusCode = response?.statusCode {
// Check for errors and build response data
(operationComplete, accessToken, error) = self.checkSignInResponse(statusCode, JSON: JSON)
}
// Call the completion handler
completionHandler(operationComplete, accessToken, error)
}
}
この関数の目的は、ユーザーから渡された情報が正しい場合に Web サービスからトークンを取得することです。
関数checkSignInResponse
(答えには役に立たないので、そのコードは報告しません) には、受け取った JSON 応答に応じて、3 つの変数を評価する役割がありますoperationComplete
。accessToken
error
3 つの変数に値が設定されたので、completionHandler
それらを使用して呼び出します。
この関数をモックする方法は?!
応答を模擬するために、userSignIn
関数をテスト関数に直接オーバーライドします (NSHipster の記事で説明されています)。
func testUserSignIn_whenParamsAreInvalid(){
class MockClient:Client {
override func userSignIn(#email: String, password: String, completionHandler:
(Bool, String?, NSError?) -> Void) {
// Set callback params
var operationComplete = false
var accessToken:String? = nil
var error:NSError? = NSError(domain: "Testing", code: 99, userInfo: nil)
completionHandler(operationComplete, accessToken, error)
}
}
signInViewController!.client = MockClient()
signInViewController!.loadView()
fillRegisterFieldsWithDataAndSubmit(femail(), password: fpassword())
XCTAssertNotNil(signInViewController!.error, "Expect error to be not nil")
}
client
次に、「モック」クライアントを使用してテストしているView Controllerの内部を置き換えます。この場合、コントローラーが無効なerror
情報を関数に渡すことをテストしているので、コントローラーのプロパティが nil でないことを確認します。このデータを強制するには、単純operationComplete
に false に設定し、手動でNSError
.
それはあなたにとって意味がありますか?このテストが良いテストかどうかはわかりませんが、少なくともデータ フローを確認できます。