OCMock - Как ожидать содержимое nsarray - PullRequest
1 голос
/ 13 апреля 2011

Я хочу проверить, что значения, которые я вставляю в базу данных, отправляются обратно делегату моего класса.

Я пытался смоделировать делегата и ожидать, что массив, который я использовал для заполнения базы данных.Сбой из-за того, что 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];
}

Спасибо за вашу помощь, Винсент

Ответы [ 2 ]

5 голосов
/ 14 апреля 2011

Get OCHamcrest ! Он предоставляет набор средств сравнения, которые работают с OCMock и позволяют проводить более чистые тесты. Вот как будет выглядеть ваше ожидание:

[[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)];

Если вы действительно не хотите использовать hamcrest по какой-либо причине, вы можете создать метод в своем тестовом классе, который будет оценивать массив статей. Но я думаю, что это некрасиво:

- (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]);
}
0 голосов
/ 13 апреля 2011

Возможно ли, что два массива имеют одинаковое содержимое, но разные адреса?Возможно, пытаюсь сравнить с isEqualToArray

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