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 模拟 UIImagePickerController
在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败