OCMock издевается над UIImagePickerController

Я пытаюсь издеваться над UIImagePickerController для тестирования метода из ViewController (написано на Swift):

var imagePicker: UIImagePickerController!

...

func choosePhoto() {
    imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .PhotoLibrary
    self.presentViewController(imagePicker, animated: true, completion: nil)
}

и тестовый класс (написанный на Objective-C):

Интерфейс:

@property (nonatomic, strong) ViewController *viewController;

Реализация:

- (void)setUp {
    [super setUp];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UINavigationController *navigationController = [storyboard instantiateInitialViewController];
    self.viewController = (ViewController *)[navigationController visibleViewController];
    self.viewController.view;
}

....

- (void)testPicker {
    id mockPicker = [OCMockObject mockForClass:[UIImagePickerController class]];
    self.viewController.imagePicker = mockPicker;

    [[mockPicker expect] setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [[(id)self.viewController expect] presentViewController:mockPicker animated:YES completion:nil];

    [self.viewController choosePhoto];

    [mockPicker verify];
}

Тест не проходит, потому что:

OCMockObject(UIImagePickerController): ожидаемый метод не был вызван: setSourceType:0

а также

не удалось: поймано «NSInvalidArgumentException», «-[ожидание MyApp.ViewController]: нераспознанный селектор отправлен в экземпляр 0x....

Кто-нибудь может мне с этим помочь?

Большое спасибо.


person jonaszmclaren    schedule 17.08.2015    source источник


Ответы (1)


Таким образом, чтобы использовать метод expect из OCMock, у вас должен быть макет объекта, ожидающего вызова метода. В этом случае вам нужно иметь макет для self.myViewController - класс ViewController, который вы используете, не имеет ожидаемого метода, поэтому он запутывается. Тот факт, что вы транслируете VC на id, маскирует проблему.

person bplattenburg    schedule 25.08.2015
comment
Спасибо за Ваш ответ. Макет для сборщика работает, но не с контроллером представления. Я провел некоторые эксперименты, и оказалось, что это ограничение языка Swift, потому что в Objective-C он проверяет, что в тестовом методе был вызван какой-то другой метод, но в Swift он не работает. - person jonaszmclaren; 26.08.2015
comment
Интересно - я еще не слишком много работал с OCMock и Swift, поэтому даже не рассматривал это. - person bplattenburg; 27.08.2015
comment
@jonaszmclaren В Swift есть намного лучший способ издеваться над объектами. не нужны сторонние библиотеки, такие как OCMock - person Ali Riahipour; 16.08.2016