CBPeripheralManager
클래스에 CBPeripheralManagerDelegate
의 역할을하는 클래스를 단위 테스트하고 싶습니다. 일반적으로 외부 클래스 종속성을 스텁 아웃하려면 클래스 이니셜 라이저를 통해 전달하거나 속성을 통해 종속성 주입 양식을 사용합니다. 싱글 톤 기반의 API를 다룰 때 키위와 같은 라이브러리를 사용하여 싱글 톤 (즉, [ClassName stub:@selector(sharedInstance) andReturn:myStubbedInstance]
)을 반환하는 클래스 수준 메소드를 스텁링 할 수있었습니다. CBPeripheralManager
을 조롱하는 경우의 문제는 이니셜 라이저가 대리인 인스턴스를 사용한다는 것입니다. 그래서 내 클래스를 사용하는 코드는 다음과 같은 것을 할 필요가있을 것이다 :코어 블루투스 API와 상호 작용하는 하나의 단위 테스트 코드는 어떻게됩니까?
PeripheralManagerWrapper *wrapper = [[PeripheralManagerWrapper alloc] init];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:wrapper queue:nil options:nil];
wrapper.peripheralManager = peripheralManager;
그런 다음 내 PeripheralManagerWrapper
클래스를 테스트 단위, 단순히 인스턴스화 수와 조롱 CBPeripheralManager
전달합니다. 그러나, 나는이 래퍼 객체의 호출 코드가이 설정을 거치도록 요구하는 것을 좋아하지 않는다. 이 상황을 다루기위한 더 좋은 패턴이 있습니까? 키위와 OCMockito를 모두 사용했지만, alloc
및 init
메서드를 CBPeripheralManager
으로 스터핑 한 다음이 인스턴스를 PeripheralManagerWrapper
의 이니셜 라이저로 인스턴스화하는 것만으로는 부족합니다.
예, 래퍼는 테스트에 관한 것이 아니라 ViewController에서 블루투스 동작을 격리시키는 것입니다. 래퍼가 가장 좋은 접미사가 아닐 수도 있습니다. –
좋습니다. 제 3 자 API와 비즈니스 로직을 분리하는 것은 항상 좋은 습관입니다. 내가 너의 질문에 대답 했니? – allprog
예. 미표로 표시하지 않으셔서 죄송합니다. –