XCTest Stubber
테스트코드를 작성하는데 Stubber라는게 있대서 알아보고자 함.
오픈소스 링크
https://github.com/devxoul/Stubber
배경
네트워크 상황과 관련한 코드를 작성하고 있는데, 이를 활용해 테스트 환경을 더 손쉽게 구축하여 본질에 집중하고자 함.
테스트 코드를 작성하면서 네트워크 상에서는 너무 변수가 많은데 이를 하나하나 다 가정하고 테스트 코드를 작성하는건 음 .. 생산성이 떨어질수도 있음.
따라서 Stubber를 이용해서 네트워크를 주입
샘플 코드
import Foundation
import Stubber // 네트워크 상에서 너무 변수가 많으니까 가상의 네트워크에서 주입하는거
import RxSwift
@testable import MyApp
class LocalNetworkStub: LocalNetwork {
// LocalNetwork 상속 받아서 사용함.
override func getLocation(by mapPoint: MTMapPoint) -> Single<Result<LocationData, URLError>> {
return Stubber.invoke(getLocation, args: mapPoint)
}
}
import RxSwift
class LocalNetwork {
private let session: URLSession
let api = LocalAPI()
init(session: URLSession = .shared) {
self.session = session
}
func getLocation(by mapPoint: MTMapPoint) -> Single<Result<LocationData, URLError>> {
guard let url = api.getLocation(by: mapPoint).url else {
return .just(.failure(URLError(.badURL)))
}
let request = NSMutableURLRequest(url: url)
request.httpMethod = "GET"
request.setValue("KakaoAK {Your API Key} ", forHTTPHeaderField: "Authorization")
return session.rx.data(request: request as URLRequest)
.map { data in
do {
let locationData = try JSONDecoder().decode(LocationData.self, from: data)
return .success(locationData)
} catch {
return .failure(URLError(.cannotParseResponse))
}
}
.catch { _ in .just(Result.failure(URLError(.cannotLoadFromNetwork))) }
.asSingle()
}
}
🟠 LocationInformationModelTest.swift
위처럼 네트워크가 실제 연결이 아니여도 init을 해줄 수 있게 된다.
(참고)
'apple > Testing, Xcode, Environment' 카테고리의 다른 글
Test Double (Swift) (0) | 2023.01.09 |
---|---|
[XCTest] XCTest에 대해서 알아보기 1편 (0) | 2022.07.03 |
[XCTest] RxTest 와 RxBlocking에 대해서 알아보자 (0) | 2022.02.20 |
[XCTest] Quick 과 Nimble에 대해서 알아보자. (0) | 2022.02.20 |
[XCTest] 🧑🏻💻 Xcode 기존 프로젝트에 XCTest 작성 파일 추가하기! (0) | 2022.02.15 |