我正在尝试在我的类上测试一个方法,该方法在另一个类上调用类方法。如果重要的话,我正在调用的第二个类包含在框架内。
我正在尝试测试的方法的简化版本。我只是想通过捕获和验证对[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];
}
我的验证总是告诉我,即使我将期望改为[OCMArg any],也没有调用预期的trackEvent方法。我做了一些明显错误的事情,或者是其他地方的问题(即糟糕的项目设置?)
答案 0 :(得分:0)
这看起来不错,应该可行。我只能想到你观察到的行为有两个原因。
如果DataCapture
类有一个也称为trackEvent:
的实例方法,那么mock将模拟实例方法而不是类方法。在这种情况下,有必要将方法调用包装在ClassMethod()
宏中,即OCMExpect(ClassMethod(...)))
。
如果情况并非如此,我的下一个猜测将是CocoaPods的问题。我已经看过几个类似的报告,最后发现CocoaPods会以某种方式两次添加相同的二进制文件。在这种情况下,OCMock可能会将其魔力添加到类的一个版本中,但测试使用另一个版本。我没有参考方便,但这不应该太难找到。
答案 1 :(得分:0)
只是让任何人遇到类似的问题我能够通过向我的测试目标添加-bind_at_load -ObjC
其他链接器标志来解决我的问题。