2017-04-07 3 views
0

URLSession完全コールバックのシグネチャに適合するメソッドで自分のクラスを定義しました。 g。 (Data?, Response?, Error?) -> Void。 このメソッドには、応答を処理するための共通のロジックが含まれています。 g。データのチェック、解析など このメソッドを単体テストしたいと思います。メソッドには、例えば、URLSessionコンプリータのユニットテストラッパー

guard let data = data else { 
    //some logic 
    return 
} 

のような検証が含まれています。この関数は実際に終了することをテストしたいと思います。もちろん、ボイドリターンに対してそれを達成することはできません(おそらく、私は何かを逃したと思います)。 別のオプション - メソッドをthrowsとマークし、特定のエラーをテストします。しかし、この方法はURLSession.shared.dataTaskメソッドに収まりません。 私はこれらのことについて妄想していますか?それを達成する可能性はありますか? ありがとうございます。

答えて

0

通常、私はいくつかの部分にクエリロジックを分離しよう:ルータ3を使用してルータ2)

1)APIクライアント)マッピングモデル

そして、あなたがテストすることができ、このすべての部品。あなたはAPIクライアントをテストするにはどうすればよい

fileprivate func testPerformanceOfGetNewsFromAPI() { 

     let expectationTimeout: Double = 30.0 

     self.measure { 

      let expectation = self.expectation(description: "Get gifters") 

      NewsAPIClient.getNews(closure: { response in 
       expectation.fulfill() 
      }) 

      self.waitForExpectations(timeout: expectationTimeout) { error in 
       XCTAssertNil(error) 
      } 
     } 
    } 

このテストでは、チェックします。 APIClientは30秒以内に応答を受け取ることができますか?私はJASONを使用し、マッピングのために

https://github.com/delba/JASON

は、セットアップあなたの迅速なファイル:次に

import XCTest 
import JASON 
@testable import ProjectName 

final class NewsTests: XCTestCase { 

    // MARK: - Properties 
    fileprivate var news: News! 

    // MARK: - Lyfecycles 
    override func setUp() { 
     super.setUp() 

     news = mockExample() 
    } 

    override func tearDown() { 

     news = nil 
     super.tearDown() 
    } 
} 

を、このクラスで作成するには、マッピングをテストすることができますどのように

あなたのモック:

fileprivate func mockExample() -> ExampleModel? { 

     let data: Data 

     let json: JSON 

     do { 
      try data = Data(resource: "MyExampleFile.json") // Here enter your JSON example file. Target member ship for this file should be your test target 

      try json = JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as! JSON 

     } catch let error { 
      XCTFail(error.localizedDescription) 
      return nil 
     } 

     let model = ExampleModel(json: json) 

     return model 
    } 

その後、あなたはこのクラスでテストを書くことができます。テストロジックで

fileprivate func testMapping() { 

     XCTAssertNotNil(news) 
     XCTAssertEqual(news.title, mockExample()?.title) 
     XCTAssertEqual(news.text, mockExample()?.text) 
     XCTAssertEqual(news.timeStamp, mockExample()?.timeStamp) 
    } 

を(彼らはJSONに存在している場合)、あなたは画像のアップロードをも追加することができます。したがって、現在のモデルが正しいかどうかを確認し、JSON応答を処理できます。

+0

お返事ありがとうございます。しかし、私はそれが私が求めているものではないと思う。私は論理的な部分への要求の流れも分けました。また、パーツの一部が失敗した場合(例えば、間違ったHTTPコード、解析できない無効なレスポンスなど)、リクエストコンプリータが終了するかどうかをテストする必要があります。フローが何か間違っていると停止しない場合、私は実行時エラーを得ることができます。ありがとう。 – Yura

関連する問題