문제

네트워크를 사용하는 코드를 테스트하고 싶습니다 ( 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 구현과 테스트가 구현됩니다. 이것은 더 많은 작업이지만 훨씬 더 나은 테스트 가능성을 의미합니다. 테스트 네트워크 계층이 필요한 모든 것을 수행 할 수 있기 때문에 테스트는 부서지기 쉬우 며 훨씬 편리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top