OCMock 模拟 UIImagePickerController

Posted

技术标签:

【中文标题】OCMock 模拟 UIImagePickerController【英文标题】:OCMock mocking UIImagePickerController 【发布时间】:2015-08-17 14:07:28 【问题描述】:

我正在尝试模拟 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....

谁能帮我解决这个问题?

非常感谢。

【问题讨论】:

【参考方案1】:

因此,要使用 OCMock 中的 expect 方法,您必须模拟期望方法调用的对象。在这种情况下,您需要对 self.myViewController 进行模拟 - 您正在使用的 ViewController 类没有 expect 方法,因此会感到困惑。您将 VC 转换为 id 的事实掩盖了这个问题。

【讨论】:

感谢您的回答。选择器的模拟正在工作,但不适用于视图控制器。我做了一些实验,结果发现这是 Swift 语言的一个限制,因为在 Objective-C 中它验证了在测试方法中调用了其他方法,但在 Swift 中它不起作用。 有趣 - 我还没有用 OCMock 和 Swift 做太多事情,所以我什至没有考虑过。 @jonaszmclaren 在 Swift 中模拟对象有很多更好的方法。不需要像 OCMock 这样的第三方库

以上是关于OCMock 模拟 UIImagePickerController的主要内容,如果未能解决你的问题,请参考以下文章

OCMock:模拟协议未正确停止

OCMock 模拟 UIImagePickerController

OCMock 部分模拟给出了意外的调用

如何在ARC的OCMock中模拟**参数

在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败

使用 OCMock 发生意外崩溃,在 NSString 上模拟“mutableCopy”