2015-08-17 3 views
3

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

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 ....

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

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

ответ

1

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

+1

Спасибо за ваш ответ. Макет для сборщика работает, но не с контроллером представления. Я сделал несколько экспериментов, и оказалось, что это ограничение языка Swift, потому что в Objective-C он проверяет, что какой-то другой метод был вызван в методе тестирования, но в Swift он не работает. – jonaszmclaren

+0

Интересно - я еще не слишком много делал с OCMock и Swift, поэтому я даже не подумал об этом. – bplattenburg

+0

@jonaszmclaren Существует намного лучший способ издеваться над объектами в Swift. не нужны сторонние библиотеки, такие как OCMock –

Смежные вопросы