2017-04-07 6 views
0

URLSession 전체 콜백 서명에 맞는 메서드로 자신 만의 클래스를 정의했습니다. 지. (Data?, Response?, Error?) -> Void. 이 방법은 응답을 처리하기위한 일반적인 로직을 포함한다. 지. 데이터 검사, 파싱 등. 이제 단위 테스트를하고 싶습니다. 메소드에는 몇 가지 확인이 포함되어 있습니다 (예 :URLSession Completer 용 단위 테스트 래퍼

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

여기에서이 함수가 실제로 종료되는지 테스트하고 싶습니다. 물론 그것은 무효 반환 (나는 그렇게 생각한다, 나는 무언가를 놓쳤을지도 모르는)에 반하여 그것을 이룰 수 없다. 다른 옵션 - 메서드를 throws으로 표시하고 특정 오류를 테스트하십시오. 그러나이 방법은 URLSession.shared.dataTask 방법에 적합하지 않습니다. 나는 이런 것들에 대해 편집증을 느낍니까? 그것을 성취 할 가능성이 있습니까? 미리 감사드립니다.

답변

0

보통 나는 몇 부분으로 쿼리 로직을 분리하려고 : 라우터 3) 맵핑 모델

그리고 당신은 테스트 할 수 있습니다 모든 부품을 사용

1) 라우터 2) 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 초 이내에 응답을받을 수 있습니까? 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 
    } 

그런 다음이 클래스에서 테스트를 작성할 수 있습니다 (그들은 JSON에있는 경우) 테스트 로직에서

fileprivate func testMapping() { 

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

, 당신은 또한 이미지 업로드를 추가 할 수 있습니다. 따라서 현재 모델이 올바른지 확인하고 JSON 응답을 처리 할 수 ​​있습니다.

+0

좋은 답변 주셔서 감사합니다. 그러나 나는 그것이 내가 요청한 것이 아니라고 생각한다. 또한 요청 흐름을 논리적 부분으로 구분했습니다. 그리고 파트의 일부가 실패한 경우 (예 : 잘못된 HTTP 코드, 구문 분석 할 수없는 유효하지 않은 응답) 요청 완료자가 종료되는지 테스트해야합니다. 뭔가 잘못되면 흐름이 멈추지 않으면 런타임 오류가 발생할 수 있습니다. 감사. – Yura