模拟类方法未被调用

时间:2015-12-24 18:59:47

标签: ios unit-testing xctest ocmock

我正在尝试在我的类上测试一个方法,该方法在另一个类上调用类方法。如果重要的话,我正在调用的第二个类包含在框架内。

我正在尝试测试的方法的简化版本。我只是想通过捕获和验证对[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方法。我做了一些明显错误的事情,或者是其他地方的问题(即糟糕的项目设置?)

2 个答案:

答案 0 :(得分:0)

这看起来不错,应该可行。我只能想到你观察到的行为有两个原因。

如果DataCapture类有一个也称为trackEvent:的实例方法,那么mock将模拟实例方法而不是类方法。在这种情况下,有必要将方法调用包装在ClassMethod()宏中,即OCMExpect(ClassMethod(...)))

如果情况并非如此,我的下一个猜测将是CocoaPods的问题。我已经看过几个类似的报告,最后发现CocoaPods会以某种方式两次添加相同的二进制文件。在这种情况下,OCMock可能会将其魔力添加到类的一个版本中,但测试使用另一个版本。我没有参考方便,但这不应该太难找到。

答案 1 :(得分:0)

只是让任何人遇到类似的问题我能够通过向我的测试目标添加-bind_at_load -ObjC其他链接器标志来解决我的问题。