2011-04-13 3 views
1

데이터베이스에 삽입 한 값이 내 클래스의 대리인에게 보내지는지 테스트하고 싶습니다.OCMock - nsarray의 내용을 예상하는 방법

위임을 조롱하고 데이터베이스를 채우는 데 사용 된 배열을 예상했습니다. 2 NSArray 같은 내용을 있지만 다른 개체 때문에 실패합니다.

필자는 성공한 모델에서 isequal 및 hash 메서드를 구현하려고 시도했습니다. 여기

오류 로그입니다 :

'OCMockObject[NewsListViewController]: unexpected method invoked: service:<RSSService-0x4c25b90-324400011.636966: 0x4c25b90> didFinishParsingRSSWithItems:(
    description102362, 
    description102362, 
    description102362, 
    description102362, 
    description102362 
) 
    expected: service:<OCMAnyConstraint: 0x4c10f30> didFinishParsingRSSWithItems:(
    description102362, 
    description102362, 
    description102362, 
    description102362, 
    description102362 
)' 

내가 어떻게 할 수 있습니까? 여기

내 테스트입니다 :

- (void) testServiceShouldNotLoadArticlesFromRSSFeedIfArticlesInDatabase { 
    NSArray *fakeArticles = [TestUtils createArticles:5]; 
    [[DatabaseManager sharedManager] saveArticles:fakeArticles]; 

    RSSService *mockService = [OCMockObject partialMockForObject:service]; 
    id mockDelegate = [OCMockObject mockForClass:NewsListViewController.class]; 
    [[mockDelegate expect] service:[OCMArg any] didFinishParsingRSSWithItems:fakeArticles]; 
    mockService.delegate = mockDelegate; 

    [mockService loadAllArticles]; 
    [mockService verify]; 
    [mockDelegate verify]; 
} 

여기에 내가 테스트하고있어 방법 : 당신의 도움에 대한

- (void) loadAllArticles { 
    NSArray *articles = [self articlesFromDatabase]; 
    [self.delegate service:self didFinishParsingRSSWithItems:articles]; 
} 

감사합니다, 빈센트

답변

0

가 가능하다는 것을 두 배열은 내용이 동일하지만 주소가 다릅니다. 어쩌면 OCHamcrest 받기 isEqualToArray

[[mockDelegate expect] service:[OCMArg any] 
    didFinishParsingRSSWithItems:[OCMArg checkWithSelector:@selector(isEqualToArray:) 
               onObject:expectedArray]] 
+0

무엇을해야할까요? 내가 빌드에서 경고있어 : "시맨틱 문제 : 'NSArray *'유형의 매개 변수에 'id *'를 보내는 호환되지 않는 포인터 유형 및 충돌 a 실행 : 이유 : '- [NSArrayM pointerValue] : 인스턴스로 전송 된 인식 할 수없는 선택기 0x6242960 ' – vdaubry

+0

답을 업데이트했습니다. 대신이 방법을 사용해보십시오. 첫 번째 게시물은 분명 정확하지 않았습니다. – AdamH

5

과 비교하려고! OCMock과 함께 작동하고 훨씬 더 깨끗한 테스트를 수행하는 많은 matchers를 제공합니다. 당신이 정말로 어떤 이유로 hamcrest을 사용하지 않으려면,

[[mockDelegate expect] service:[OCMArg any] didFinishParsingRSSWithItems:contains(article1, article2, article3, article4, article5, nil)]; 
// or, if order is unpredictable 
[[mockDelegate expect] service:[OCMArg any] didFinishParsingRSSWithItems:containsInAnyOrder(article1, article2, article3, article4, article5, nil)]; 

당신이 기사 배열을 평가하는 테스트 클래스의 메소드를 만들 수 있습니다 여기에 귀하의 기대의 모습거야. 그러나 나는보기 흉한 것 같아요.

- (void) testServiceShouldNotLoadArticlesFromRSSFeedIfArticlesInDatabase { 
    NSArray *fakeArticles = [TestUtils createArticles:5]; 
    [[DatabaseManager sharedManager] saveArticles:fakeArticles]; 

    RSSService *mockService = [OCMockObject partialMockForObject:service]; 
    id mockDelegate = [OCMockObject mockForClass:NewsListViewController.class]; 
    [[[mockDelegate stub] andCall:@selector(service:verifyFiveArticles:) onObject:self] service:[OCMArg any] didFinishParsingRSSWithItems:[OCMArg any]]; 
    mockService.delegate = mockDelegate; 

    [mockService loadAllArticles]; 
    [mockService verify]; 
    [mockDelegate verify]; 
} 

-(void)service:(id)service verifyFiveArticles:(NSArray *)articles { 
    STAssertEquals(5, [articles count]); 
} 
관련 문제