首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCMock和AVCaptureDeviceInput

OCMock和AVCaptureDeviceInput
EN

Stack Overflow用户
提问于 2015-02-17 12:28:50
回答 1查看 177关注 0票数 1

我正在将我们的测试套件从OCMock 2升级到OCMock 3,并且遇到了一些问题。问题之一是我们试图模仿AVCaptureDeviceInput。

对于其中一个测试,当在AVCaptureDeviceInput上调用类方法时,我们希望返回一个模拟实例AVCaptureDeviceInput。

在我们的设置方法中:

代码语言:javascript
复制
 self.mockAVCaptureDeviceInputClass = [OCMockObject mockForClass:[AVCaptureDeviceInput class]];

在我们的测试中:

代码语言:javascript
复制
    id deviceInput = [OCMockObject mockForClass: [AVCaptureDeviceInput class]];
    [[[[self.mockAVCaptureDeviceInputClass stub] classMethod] andReturn:deviceInput]
     deviceInputWithDevice:mockDevice error:((NSError __autoreleasing **)[OCMArg setTo:nil])];

问题似乎是,deviceInput覆盖了self.mockAVCaptureDeviceInputClass,因此当classMethod被存根时,它不会做任何事情。

我尝试过的另一种方法是为AVCaptureDeviceInput实例创建一个模拟,但这只是挂起:

代码语言:javascript
复制
[OCMockObject partialMockForObject: [AVCaptureDeviceInput new]];

具有以下堆栈跟踪:

代码语言:javascript
复制
    0x000000010938a219 in _object_set_associative_reference ()
    0x0000000108aed5c3 in OCMSetAssociatedMockForClass at /Users/otusweb/Desktop/dfsa/Pods/OCMock/Source/OCMock/OCMFunctions.m:226
    0x00000001144ecce2 in -[OCClassMockObject prepareClassForClassMethodMocking] at /Users/otusweb/Desktop/dfsa/Pods/OCMock/Source/OCMock/OCClassMockObject.m:89
    0x00000001144ec934 in -[OCClassMockObject initWithClass:] at /Users/otusweb/Desktop/dfsa/Pods/OCMock/Source/OCMock/OCClassMockObject.m:31
    0x00000001144f47f6 in -[OCPartialMockObject initWithObject:] at /Users/otusweb/Desktop/dfsa/Pods/OCMock/Source/OCMock/OCPartialMockObject.m:33
    0x00000001144f1cdd in +[OCMockObject partialMockForObject:] at /Users/otusweb/Desktop/dfsa/Pods/OCMock/Source/OCMock/OCMockObject.m:58
    0x00000001144e9abe in -[dfsaTests testExample] at /Users/otusweb/Desktop/dfsa/dfsaTests/dfsaTests.m:33
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-18 08:31:09

您遇到了一个常见问题:只有一个模拟对象可以模拟给定类的类方法。这在限制部分(http://ocmock.org/reference/#limitations)中有记录。目前,最后一次模拟创建了“胜利”。

在您的情况下,您在安装方法(self.mockAVCaptureDeviceInputClass)中设置了第一个模拟,然后在测试(deviceInput)中为同一个类创建了第二个模拟。此时,只有后一种方法可以在AVCaptureDeviceInput上存根类方法。

这个问题越来越普遍,我决定给OCMock添加一个警告。我正在考虑模拟对象打印警告的情况,如果它有活动存根,那么它就会因为类方法的死掉而被停用。FWIW,正在进行一些调查,以确定在同一个类(https://github.com/erikdoe/ocmock/issues/173)上是否可能有多个模拟对象模拟类方法,但这并不简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28561511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档