我正在将我们的测试套件从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发布于 2015-02-18 08:31:09
您遇到了一个常见问题:只有一个模拟对象可以模拟给定类的类方法。这在限制部分(http://ocmock.org/reference/#limitations)中有记录。目前,最后一次模拟创建了“胜利”。
在您的情况下,您在安装方法(self.mockAVCaptureDeviceInputClass)中设置了第一个模拟,然后在测试(deviceInput)中为同一个类创建了第二个模拟。此时,只有后一种方法可以在AVCaptureDeviceInput上存根类方法。
这个问题越来越普遍,我决定给OCMock添加一个警告。我正在考虑模拟对象打印警告的情况,如果它有活动存根,那么它就会因为类方法的死掉而被停用。FWIW,正在进行一些调查,以确定在同一个类(https://github.com/erikdoe/ocmock/issues/173)上是否可能有多个模拟对象模拟类方法,但这并不简单。
https://stackoverflow.com/questions/28561511
复制相似问题