Тестирование приложения OCUnit: Попытка проверить UIPageControl numberOfPages == NSArray count - PullRequest
0 голосов
/ 12 декабря 2011

Я относительно новичок в OCUnit и OCMock, поэтому, пожалуйста, потерпите меня. У меня есть контроллер представления, который содержит UIPageControl, где количество страниц рассчитывается из подсчета NSArray (который заполняется из базовых данных). Это делается в методе ViewDidLoad следующим образом:

- (void)ViewDidLoad {
    [super viewDidLoad];

    ... other code ...

    self.pageControl.numberOfPages = [self.viewedPages count];
    self.pageControl.currentPage = 0;

    NSLog(@"%d", controller.pageControl.numberOfPages);
    NSLog(@"%d", [controller.viewedPages count]);
}

В журнале отображаются совпадающие целочисленные значения и для viewsPages, и для numberOfPages, и, к счастью, если я выполню приведенный ниже тест, утверждение верно:

- (void)testPageControl {
    [controller viewDidLoad];
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"...");
}

Однако, как уже упоминалось, этот процесс основан на использовании массива с объектами из Core Data, поэтому я решил попробовать свои силы в OCMock, чтобы заменить его предопределенным массивом для эффективного удаления элемента Core Data. При этом теперь я получаю результаты, которых не понимаю.

Вот как выглядит мой новый тест:

- (void)testPageControl {
    id mock = [OCMockObject partialMockForObject:controller];
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...];
    [[[mock stub] andReturn:mockPagesArray] viewedPages];

    [controller viewDidLoad];

    NSLog(@"%d", [controller.pageControl numberOfPages]);
    NSLog(@"%d", [controller.viewedPages count]);
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"...");
    [mockPagesArray release];
}

Что меня смущает, так это то, что в этих сценариях NSLog показывает, что количество просматриваемых страниц соответствует количеству созданного мною массива (отлично!), Но numberOfPages всегда равно нулю? В результате тест не пройден.

Я также попытался переключить функцию, которая загружает массив visiblePages в контроллер, с локальной функцией в тестовом контроллере, которая возвращает предопределенный массив, т.е.

[[[mock stub] andCall:@selector(createMockPageViews) onObject:self] loadPageViews];

Однако это имело точно такой же результат, как и выше. Тест по-прежнему не проходит, потому что numberOfPages возвращает 0, в то время как массив просматриваемых страниц показывает ожидаемое количество.

Как я уже сказал, я новичок в OCUnit и OCMock, поэтому я надеюсь, что этот вопрос настолько подробен, насколько это возможно, и имеет смысл. Я надеюсь, что это связано с недоразумением с моей стороны о том, как работает OCMock, и кто-то может исправить меня - я буду вечно благодарен! Похоже, что для начинающих учиться не хватает приличной документации по OCUnit и OCMock для разработки на iPhone, и эта маленькая проблема сводит меня с ума уже два дня ...

Заранее спасибо

1 Ответ

1 голос
/ 13 декабря 2011

Ваш controller.pageControl, скорее всего, ноль.Это может быть связано с тем, что он не связан с IBOutlet или иным образом не инициализирован, или потому что ваши модульные тесты на самом деле не выполняются в исполняемом файле приложения.Взгляните на шаги в настройке вашей цели для юнит-теста и проверьте свои настройки.

В качестве альтернативы, вы можете посмеяться над объектом UIPageControl:

- (void)testPageControl {
    id mockPageControl = [OCMockObject mockForClass:[UIPageControl class]];
    [[mockPageControl expect] setNumberOfPages:3];
    [[mockPageControl expect] setCurrentPage:0];

    id mock = [OCMockObject partialMockForObject:controller];
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...];
    [[[mock stub] andReturn:mockPagesArray] viewedPages];
    [[[mock stub] andReturn:mockPageControl] pageControl];

    [controller viewDidLoad];

    [mockPageControl verify];
}
...