Unit testing OCMock和AVCaptureDeviceInput

Unit testing OCMock和AVCaptureDeviceInput,unit-testing,ocmock,avcapturedevice,Unit Testing,Ocmock,Avcapturedevice,我正在将我们的测试套件从OCMock 2更新到OCMock 3,并且遇到了一些问题。 其中一个问题是我们试图模拟AVCaptureDeviceInput 对于其中一个测试,我们希望在对AVCaptureDeviceInput调用类方法时返回模拟实例AVCaptureDeviceInput 在我们的设置方法中: self.mockAVCaptureDeviceInputClass = [OCMockObject mockForClass:[AVCaptureDeviceInput class]]

我正在将我们的测试套件从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

您遇到了一个常见问题:对于给定的类,只有一个模拟对象可以模拟类方法。这在限制部分()中有记录。当前,最后一个模拟创建了“wins”

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

这个问题越来越普遍,我决定在OCMock中添加一个警告。我考虑的是,当模拟对象因类方法存根而停用时,如果它有活动存根,它会打印一条警告。FWIW,目前正在进行一些调查,以确定是否可能在同一个类()上有多个mock-object-mock-class方法,但这并不简单