OCMock和AVCaptureDeviceInput

时间:2015-02-17 12:28:50

标签: unit-testing ocmock avcapturedevice

我正在将我们的测试套件从OCMock 2更新到OCMock 3,并且遇到了一些问题。 其中一个问题是我们正在尝试模拟AVCaptureDeviceInput。

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

在我们的设置方法中:

 self.mockAVCaptureDeviceInputClass = [OCMockObject mockForClass:[AVCaptureDeviceInput class]];

在我们的测试中:

    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的一个实例创建一个模拟,但这只是挂起:

[OCMockObject partialMockForObject: [AVCaptureDeviceInput new]];

使用以下堆栈跟踪:

    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

1 个答案:

答案 0 :(得分:1)

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

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

这个问题越来越普遍,我决定向OCMock添加一个警告。我正在考虑模拟对象在类方法存根被取消激活时具有活动存根的情况下打印警告。 FWIW,正在进行一些调查,看看是否可以在同一个类(https://github.com/erikdoe/ocmock/issues/173)上拥有多个模拟对象模拟类方法,但这并非无足轻重。