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