模拟 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 其他链接器标志添加到我的测试目标来解决我的问题。