【问题标题】:Mock class method not being called模拟类方法没有被调用
【发布时间】:2016-03-31 03:21:51
【问题描述】:

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

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

【问题讨论】:

    标签: ios unit-testing xctest ocmock


    【解决方案1】:

    这看起来不错,应该可以工作。对于您观察到的行为,我只能想到两个原因。

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

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

    【讨论】:

    • 谢谢,我将添加 ClassMethod() 包装器并仔细检查。我确实将我的测试目标添加到了我的 Podfile 中,并将 libPods.a 链接到我的主要目标和测试目标,这不是吗?当我构建这个测试目标时,我认为我没有链接它会出错。
    • 还是没有爱。我不仅进行了 ClassMethod() 包装,而且我从测试目标中删除了 libPod.a 并且仍然得到“未调用预期方法”。
    • 我不是 CocoaPods 方面的专家。但是,如果我没记错之前的讨论,将 libPods.a 添加到两个目标是许多问题的原因。请记住,这些是静态库,将它们添加到两个目标将意味着相同的代码(实际的二进制文件)将作为单独的副本出现在每个目标中。
    • 是的,我对 CocoaPods 和 UnitTesting 还很陌生,所以我只是在关注之前所做的事情。但这完全有道理。不幸的是,我仍然没有更接近解决我的嘲笑问题。
    【解决方案2】:

    如果有人遇到类似问题,我可以通过将 -bind_at_load -ObjC 其他链接器标志添加到我的测试目标来解决我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多