2013-03-07 3 views
3

을 ocmock 사용 nsnotificationcenter에 호출 : notificaitonCenterMock 그냥 ID입니다내 기본 모의 수업

- (void)tearDown 
{ 
    _mockApplication = nil; 
    self.observerMock = nil; 
    self.notificationCenterMock = nil; 
} 

; 내 테스트에서 그런

나는이 같은 일을 :

이제
self.notificationCenterMock = [OCMockObject partialMockForObject:[NSNotificationCenter defaultCenter]]; 
[(NSNotificationCenter *) [self.notificationCenterMock expect] 
     removeObserver:self.component 
        name:UIApplicationDidBecomeActiveNotification 
       object:nil]; 

..이 코드를 실행하면 내 단위 테스트는 외관상 하나 개의 실행, 70 또는 65에서 실행됩니다 (예 : 60 (370)의 실패 다음). 몇 가지 단위 테스트는 다음 오류와 함께 실패합니다.

OCPartialMockObject[NSNotificationCenter]: expected method was not invoked: removeObserver:  
<VPBCAdComponent-0x17d43e0-384381847.515513: 0x17d43e0> name:@"UIApplicationDidBecomeActiveNotification" object:nil 
Unknown.m:0: error: -[VPBCAdComponentTests testCleanUpAfterDisplayingClickthrough_adBrowser_delegateCallback] :  
OCPartialMockObject[NSNotificationCenter]: expected method was not invoked: removeObserver: 
<VPBCAdComponent-0x17d43e0-384381847.515513: 0x17d43e0> name:@"UIApplicationDidBecomeActiveNotification" object:nil 

테스트가 종료됩니다. 알림 센터를 부분적으로 조롱하면 테스트 스위트를 실행하는 데 문제가 있음을 분명히 알 수 있습니다.

질문은 무엇입니까? 관찰자와 같은 중요한 것들을 설정하고 회귀 증거를 보장하는 것은 매우 좋을 것입니다.

+0

보다 구체적으로 말하면, 어떻게 해드트에서 가짜를 제거 할 수 있습니까? 그것은 nil로 설정하는 것으로 충분하지 않습니다. – Infrid

+0

어디에서 removeObserver를 호출합니까? – psobko

답변

0

이 경우 부분 모의를 피할 수 있다면 그렇게하십시오. 옵저버가 추가되고 제거되었는지 테스트하려는 경우 표준 모의 객체 또는 멋진 모의 객체를 사용할 수 있어야합니다.

관찰자가 추가 및 제거되었는지 확인하는 테스트를 몇 개만 분리 할 수 ​​있다면 이러한 리플 효과가 없어야합니까?

id mockCenter = [OCMockObject mockForClass:[NSNotificationCenter class]]; 
[[mockCenter expect] addObserver:observer options:UIApplicationDidBecomeActiveNotification context:nil]; 

// method on the Subject Under Test 

[mockCenter verify]; 
0

개인적으로 이러한 경우에는 로컬 모의를 사용하십시오. 크기가 작은 모의 범위는 응용 프로그램의 다른 부분과의 간섭을 줄입니다. NSUserDefaults 또는 다른 공유 객체의 경우 더욱 중요합니다. 내가 사용하는 테스트 패턴은 동일합니다.

- (void)testRegisterNofificaitonTest { 
    id ncMock = OCMClassMock([NSNotificationCenter class]); 
    OCMStub([ncMock defaultCenter]).andReturn(ncMock); 

    UIViewController *sut = [UIViewController new]; 
    [[ncMock expect] addObserver:sut selector:@selector(doSomething:) name:@"NotificationName" object:nil]; 

    [sut viewDidLoad]; //assuming viewDidLoad calls [[NSNotificationCenter defaultCenter] addObserver: ... 

    [ncMock verify]; 
    [ncMock stopMocking]; 
} 
관련 문제