nsurlconnection으로 단위 테스트
-
03-07-2019 - |
문제
네트워크를 사용하는 코드를 테스트하고 싶습니다 ( NSURLConnection
클래스, 구체적으로). 코드 (전화합시다 NetworkManager
) 이렇게 보인다 :
- (id) buildConnection
{
// some more code and then:
return [NSURLConnection …];
}
- (void) startNetworkSync
{
id connection = [self buildConnection];
//…
}
단위 테스트에서 네트워킹을 제거하고 싶습니다. 교체 NSURLConnection
조롱으로 물체. 어떻게해야합니까?
나는 부분적인 모의를 만들려고 노력했다 NetworkManager
그것은 대체 할 것입니다 buildConnection
스터브에 의한 방법. 문제는 다음과 같이 부분적인 모의입니다 OCMOCK 외부 세계의 스터브 메시지 만 보내십시오 - 보내기 buildConnection
~로부터 startNetworkSync
스텁이 아닌 원래 방법을 호출합니다.
나는 또한 원숭이 패치를 시도했다 NetworkManager
카테고리를 통해 클래스. 이것은 작동합니다 buildConnection
다른 코드로 메소드를 대체하고 실제를 대체합니다 NSURLConnection
스터브와 함께. 문제는 테스트에서 스터브 연결을 얻을 수있는 간단한 방법을 찾지 못했다는 것입니다. 연결은 NetworkManager
.
그런 다음 서브 클래스를 할 수있었습니다 NetworkManager
, buildConnection
메소드 및 생성 된 연결에 대한 인스턴스 변수와 액세서를 추가하십시오. 그러나 이것은 많은 코드처럼 보입니다.
이것을 어떻게 해결 하시겠습니까? 나는 유지하는 솔루션을 찾고 있습니다 NetworkManager
클래스 디자인은 깨끗하고 테스트에서 많은 마법이나 많은 코드가 필요하지 않습니다.
해결책
이것은 의존성 주입이 해결되도록 설계된 것의 종류입니다. 사용하는 경우 startNetworkSyncWithConnection:(NSURLConnection*)
대신 모의 연결로 메소드를 쉽게 테스트 할 수 있습니다. 고객의 API를 변경하고 싶지 않다면 유지할 수도 있습니다. startNetworkSync
아무것도하지 않고 그 새로운 방법을 부르는 포장지로 [self buildConnection]
논쟁으로.
다른 팁
실제 부분 모의를 지원하기 위해 Ocmock을 수정했습니다. github에 대한 리포.
최근에 사용한 또 다른 솔루션은 네트워킹 인터페이스를 완전히 추상화하는 것입니다. 클래스가 네트워크에서 일부 데이터가 필요한 경우 프로토콜로 명시 적으로 모델링 할 수있는 일부 서버 서비스와 상호 작용할 수 있습니다.
@protocol SomeNetworkService
- (NSArray*) allAvailableFoos;
- (void) insertNewFoo: (Foo*) foo;
@end
그런 다음 실제 HTTP 구현과 테스트가 구현됩니다. 이것은 더 많은 작업이지만 훨씬 더 나은 테스트 가능성을 의미합니다. 테스트 네트워크 계층이 필요한 모든 것을 수행 할 수 있기 때문에 테스트는 부서지기 쉬우 며 훨씬 편리합니다.