2013-01-20 3 views
4

내가 전에 들었고 최근에 Jon Reid's very good screencast, 일부 init 방법 또는 iOS 응용 프로그램에서 배웠던 것처럼 viewDidLoad 방법은 더 커지고 커지는 경향이 있습니다. 이제 그 세 가지 방법이 지금 장치가 테스트되고리팩토링 된 메소드를 테스트하십시오 (여러 메소드로 분리)?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setDefaultResourceNames]; 
    [self setupRightBarButtonItems]; 
    [self restoreNavigationControllerHierarchy]; 

    [[NSNotificationCenter defaultCenter] addObserver: (...)]; 

} 

:이 말하기 이름을 가진 다른 방법에 대한 호출을 포함하는 아주 좋은 짧은 방법으로 대체되었다

- (void)viewDidLoad { 
    // 10+ lines of setting default property 

    // 20+ lines of setting up the navigation bar 

    // 20+ lines of resetting the view hierarchy 
} 

:이 방법을 리팩토링 시도 이전보다 훨씬 나아졌습니다. 이제 내 질문은 viewDidLoad 메서드를 테스트해야합니까?

이 작업을 수행하기 위해, 나는 시험에서 내 수업 중 일부 모의을 만든 다음 테스트 썼다 :

- (void)testViewDidLoadShouldInstantiateControllerCorrectly { 
    NewsItemDetailsViewController *sut = [[NewsItemDetailsViewController alloc] init]; 
    id mockSut = [OCMockObject partialMockForObject:sut]; 
    [[mockSut expect] setDefaultResourceNames]; 
    [[mockSut expect] setupRightBarButtonItems]; 
    [[mockSut expect] restoreNavigationControllerHierarchy]; 

    [mockSut viewDidLoad]; 

    [mockSut verify]; 
} 

이 좋은가요를? 이것은 메소드를 호출하여 발생하는 효과보다는 실제 소스 코드와 메소드 실행에 크게 결합되어있는 것 같습니다. (실제로 이것은 단위 테스트가 무엇인지에 관한 것입니다. 그러나이 메서드 호출의 효과는 하위 메서드를 테스트하는 세 가지 단위 테스트에서 실제로 다룹니다.

이 테스트를 수행하는 것이 좋습니까? 아니면 다른 모든 호출이 이미 테스트 중에 있습니까?

+1

실제 앱에서 발생하는 것이 아니기 때문에'viewDidLoad'를 직접 호출하지 마십시오. 그냥 [sut view] 나 [mockSut view]를 호출하면된다. 뷰 객체를 인스턴스화하면 모든 뷰 생성 메소드가 올바른 순서로 진행됩니다. –

+0

힌트를 보내 주셔서 감사합니다! –

답변

1

이것은 매우 합리적인 방법입니다. 두 가지 유형의 테스트를 원합니다 : 1) 중단하고 싶지 않은 것, 2) 문서화하려는 것. 이 방법이 이러한 기준 중 하나 또는 둘 모두에 적합하면 괜찮습니다.

이 테스트의 주요 단점은 자명 한 뭔가에 코딩 오버 헤드를 많이 추가 할 수 있다고 생각합니다. 보기 설정 코드는 종종 매우 가독성이 있습니다. 검사 코드를 통해 검사하고 무슨 일이 벌어지고 있는지 이해할 수 있으므로 많은 문서 값을 추가하지 않아도됩니다. 보기가 앱을 사용할 때마다 사용하는보기 인 경우보기 설정이 손상된 경우 품질 보증을 수행 할 때 즉시 명확해질 수 있으므로 테스트에서 많은 코딩 값을 추가하지 않습니다.

결국이 코드를 유지 관리 할 책임이있는 사람은 개발자가됩니다. 따라서 테스트 작업이 나중에 위험을 능가하는지 여부를 결정하는 것은 최종 사용자의 몫입니다.

+0

고맙습니다. 나는 당신의 대답이 당신이이 특별한 질문에 대해 얻을 수있는 가장 완벽하다고 느낍니다. –

1

테스트 대상에 따라 다릅니다. 여기에는 일반적인 해결책이 없습니다. 자신의 전문적 판단에 따라 결정을 내려야합니다.

제어 흐름을 테스트하거나 회귀 안전망을 제공하는 것이 유리합니까? 이익이 비용보다 중요한가?

일관성을 위해 조롱하는 것이 거의 권장되지 않습니다. 대부분의 경우 유해한 것으로 판명되었습니다. 그것을 실제로 필요로하는 도구로 사용하십시오.

+0

그래서 여러분이 말하는 것은 다음과 같습니다. 초기화 메소드가이 작업을 정확히 수행하는지 확인하고 싶다면이 작업을 조롱하여 테스트해야합니다. "일관성을 위해서"란 무엇을 의미합니까? 언제 내가 무언가를 조롱하면 안 되는가? –

+0

아무 것도 얻지 못하면. 조롱은 IO 및 부작용으로부터 격리 된 클래스 테스트에 도움이되는 도구로 처음 소개되었습니다.그런 다음 개념은 백그라운드에서 제어 흐름도 테스트해야한다고 생각했지만 실제로는 이점을 능가하는 비용이 이점보다 큽니다. –

관련 문제