模拟 class 方法未被调用
Mock class method not being called
我正在尝试在我的 class 上测试一个调用另一个 class 上的 class 方法的方法。如果重要的话,我调用的第二个 class 包含在一个框架内。
我正在尝试测试的方法的简化版本。我只想通过捕获和验证对 [DataCapture trackEvent:].
的调用来验证 switch 语句是否符合我的预期
- (void)beaconValue:(NSInteger)value
{
NSString* elementIdValue;
switch(value)
{
case 1:
elementIdValue = @"One";
break;
case 2:
elementIdValue = @"Two";
break;
case 3:
elementIdValue = @"Three";
break;
}
[DataCapture trackEvent:elementValueId];
}
这是我编写的我希望能运行的测试:
- (void)testCaptureData_1
{
id mockDataCapture = OCMClassMock([DataCapture class]);
OCMExpect([mockDataCapture trackEvent:@"One"]);
[[BeaconingService sharedBeaconingService] beaconValue:1];
OCMVerifyAll(mockDataCapture);
[mockDataCapture stopMocking];
}
我的验证总是告诉我没有调用预期的 trackEvent 方法,即使我将预期更改为 [OCMArg any]。我是在做一些明显错误的事情还是其他地方的问题(即错误的项目设置?)
这看起来不错,应该可以。对于您观察到的行为,我只能想到两个原因。
如果 DataCapture
class 有一个也称为 trackEvent:
的实例方法,那么 mock 将模拟实例方法而不是 class 方法。在这种情况下,有必要将方法调用包装在 ClassMethod()
宏中,即 OCMExpect(ClassMethod(...)))
.
如果情况并非如此,我的下一个猜测可能是 CocoaPods 的问题。我看过几个类似的报告,最后发现 CocoaPods 会以某种方式将相同的二进制文件添加两次。在这种情况下,OCMock 可能将其魔力添加到 class 的一个版本,但测试使用另一个版本。我手边没有参考资料,但这应该不难找到。
为了防止有人遇到类似问题,我能够通过将 -bind_at_load -ObjC
其他链接器标志添加到我的测试目标来解决我的问题。
我正在尝试在我的 class 上测试一个调用另一个 class 上的 class 方法的方法。如果重要的话,我调用的第二个 class 包含在一个框架内。
我正在尝试测试的方法的简化版本。我只想通过捕获和验证对 [DataCapture trackEvent:].
的调用来验证 switch 语句是否符合我的预期- (void)beaconValue:(NSInteger)value
{
NSString* elementIdValue;
switch(value)
{
case 1:
elementIdValue = @"One";
break;
case 2:
elementIdValue = @"Two";
break;
case 3:
elementIdValue = @"Three";
break;
}
[DataCapture trackEvent:elementValueId];
}
这是我编写的我希望能运行的测试:
- (void)testCaptureData_1
{
id mockDataCapture = OCMClassMock([DataCapture class]);
OCMExpect([mockDataCapture trackEvent:@"One"]);
[[BeaconingService sharedBeaconingService] beaconValue:1];
OCMVerifyAll(mockDataCapture);
[mockDataCapture stopMocking];
}
我的验证总是告诉我没有调用预期的 trackEvent 方法,即使我将预期更改为 [OCMArg any]。我是在做一些明显错误的事情还是其他地方的问题(即错误的项目设置?)
这看起来不错,应该可以。对于您观察到的行为,我只能想到两个原因。
如果 DataCapture
class 有一个也称为 trackEvent:
的实例方法,那么 mock 将模拟实例方法而不是 class 方法。在这种情况下,有必要将方法调用包装在 ClassMethod()
宏中,即 OCMExpect(ClassMethod(...)))
.
如果情况并非如此,我的下一个猜测可能是 CocoaPods 的问题。我看过几个类似的报告,最后发现 CocoaPods 会以某种方式将相同的二进制文件添加两次。在这种情况下,OCMock 可能将其魔力添加到 class 的一个版本,但测试使用另一个版本。我手边没有参考资料,但这应该不难找到。
为了防止有人遇到类似问题,我能够通过将 -bind_at_load -ObjC
其他链接器标志添加到我的测试目标来解决我的问题。