2016-02-02 2 views
6

Alamofireを使用して、JSONを返すことを期待するリモートURLを照会するSwift 2コードがあります。十分に正しく動作することを合理的に確信するために、十分な対話型テストを行っています。今私はそれを単位テストしたいので、私はこのコードに頼り、他のものに移ることができます。Alamofireレスポンスのみを模擬するにはどうすればよいですか?

私は数十年にわたってOO Perlをプログラミングしてきましたが、私はSwiftには新しいので、おそらく私が見逃したことがあります。

これまでのチェックコードの設定方法(ヤクシェシを避けるためにユーザー名とパスワードを削除する方法など重要ではないもの)呼び出しコードはユーザー名とパスワードを指定し、結果が取得されるたびに2つのコールバックの1つが呼び出されることを想定しています。 (私は取得していない限り、エラーに対処するようなので、サイド追跡され、その対象に乗らないで下さい。)

struct checkUsernameHandler { 
    var onSuccess:() ->() 
    var onFailure:() ->() 
} 
struct checkUsernameOutput { 
    var authenticated: Bool? 
} 

func checkUsername(user: User, handler: checkUsernameHandler) { 
    Alamofire.request(.PUT, NSURL(string: baseURL + "/user/verify?key=" + apiKey)!, 
     parameters: [ 
      "username": user.username!, 
      "password": user.password!, 
     ], 
     encoding: .JSON 
    ).responseJSON { response in 
     let checkusernameOutput = self.analyseCheckUsernameResponse(response) 
     if let authenticated = checkusernameOutput.authenticated { 
      if authenticated { 
       handler.onSuccess() 
      } else { 
       handler.onFailure() 
      } 
     } 
    } 
} 

func analyseCheckUsernameResponse (response: Response<AnyObject, NSError>) -> checkUsernameOutput { 
    var output = checkUsernameOutput() 
    if (response.result.isSuccess) { 
     if let JSON = response.result.value as? NSDictionary { 
      // ... 
     } 
    } else { 
     print("Didn't get proper JSON or something: \(response.result.error)") 
    } 
    return output 
} 

は何を私が探していることは、生のJSONを取って、それを渡す方法です何らかの理由でAlamofireに返信したので、何も得られなかった場合(タイムアウト?)、返されたデータが無効な場合(HTML形式の404または500ページなど)、適切なものを含むレスポンスオブジェクトを生成できます。

私は関数checkUsernameを使用していますので、 "OHHTTPStubsを使用する"と言う人には興味がありません。私は不確かなコードだけをテストしていますが、これは私が書いたコードです。

EDITは:Alamofireの内部が十分に偽のレスポンスを作成することに接続されているように見え、より多くのいくつかについてfaffedた、私はかなりのすべてのネットワーク接続とにかくを立ち上げる作業の操作を行う必要があります。だから、おそらく答えは "それはあまりにも面倒です"ですか?

+0

あなたは「モックAlamofire」で検索しました、があるように思われますhttps://github.com/Alamofire/Alamofire/blob/master/Tests/URLProtocolTests.swift#L27-L81やhttp://stackoverflow.com/questions/26918593/unit-testing-http-trafficのようないくつかの有益な提案-in-alamofire-app – Michael

+1

はい、なぜ私はスタック全体を嘲笑することに興味がないと言ったのですか。 –

+0

レスポンスのみを模擬する方法がありますか? –

答えて

4

私は、URLProtocolのstartLoadingメソッドをオーバーライドして成功しました。この例は、URLProtocolTests.swiftのAlamofireのテストディレクトリ内にあります。

この呼び出しを傍受することで、着信要求を取得し、選択した模擬応答に一致するようにURLを解析することができます。以下は、私が応答を処理する方法の例です。私はここにgithubの上でこれを行う方法の完全な例を掲載

override func startLoading() { 
    //Seperate module I used to handle the request 
    let data:NSData = mocks.find(request) as! NSData 

    let client = self.client 
    let response = HTTPURLResponse(url: (request.url)!, statusCode: 200, httpVersion: "HTTP/1.1", headerFields: cannedHeaders) 

    client?.urlProtocol(self, didReceive: response!, cacheStoragePolicy: URLCache.StoragePolicy.notAllowed) 
    cannedResponse = data 
    client?.urlProtocol(self, didLoad: cannedResponse as! Data) 
    client?.urlProtocolDidFinishLoading(self) 

    activeTask?.resume() 
} 

https://github.com/ksteigerwald/MockAlamofire

+0

これを簡略化するGitHubライブラリがあります。https://github.com/ksteigerwald/Hunkered – rambossa

関連する問題