import XCTest
@testable import OpenMarket
final class OpenMarketNetworkTests: XCTestCase {
var sut_networkManager: NetworkManager!
var sut_apiNode: APINode!
override func setUpWithError() throws {
try super.setUpWithError()
sut_networkManager = NetworkManager()
sut_apiNode = APINode()
}
override func tearDownWithError() throws {
try super.tearDownWithError()
sut_networkManager = nil
sut_apiNode = nil
}
func test_getItemList_title() {
let expectation = XCTestExpectation()
sut_networkManager.getItemList(node: sut_apiNode, page: 1) { result in
// given
expectation.fulfill()
switch result {
// when
case .success(let itemList):
// then
XCTAssertEqual(itemList.items[0].title, "MacBook Pro" )
case .failure(let error):
XCTFail("\(error)")
}
}
wait(for: [expectation], timeout: 2)
}
}
해당 테스트가 잘못된 이유는 이 테스트는 절대적으로 네트워크에 의존하고 있기 때문입니다. 그렇기 때문에 인터넷연결이 끊어지면 테스트에 실패하게 될 것입니다. 테스트가 외부변수에 의해 영향을 받고 있기 때문에 잘못된 테스트인 것입니다.
이를 개선하기 위해서는 실제 production 네트워크 매니저와 테스트에서 사용할 네트워크 매니저를 분리 시켜야 합니다. 즉 실제 앱에서는 실제 URLSession을 제공하는 네트워크 매니저를 사용할 것이지만 테스트환경에서는 이 URLSession을 흉내 내는 Mock Object
를 사용해야 합니다.
[참고]: