【问题标题】:How to ignore the actual value of argument passed into the function under test如何忽略传递给被测函数的参数的实际值
【发布时间】:2016-06-03 12:59:29
【问题描述】:

我正在使用OCMock 3 在我的 iOS 项目中进行单元测试。

我只是想验证一个函数是否被调用而不关心传入的参数值是什么

例如,我想验证以下函数是否被调用:

[school startTime:currentTime];

(简短说明:School 类中的函数-(void)startTime:(long long) 接受long long 类型参数)

在我的测试用例中我尝试过:

OCMVerify([schoolMock startTime:(long long)[OCMArg any]]);

我很确定被测代码已被调用,但出现错误: OCMockObject(School):Method startTime:2005634354 was not invoked.

看起来 OCMock 仍在验证传递给函数的参数的确切值。 为什么?

【问题讨论】:

  • startTime: 方法中放置一个断点以确保它被调用。
  • @stevekohls,做到了,它被调用了。
  • 当您遇到断点时,记录调用实例以验证它是一个模拟而不是真正的实现。
  • @KyleParent ,我做到了,它确实在模拟实例上运行。
  • 你能分享你的测试和任何相关的实现吗?

标签: ios objective-c unit-testing ocmock


【解决方案1】:

您从[OCMArg any] 转换为(long long) 类型会将OCMock 对象转换为值2005634354,这就是为什么测试期望它作为参数。 startTime 需要一个非对象参数,[OCMArg any] 不支持该参数。如果您将强制转换为long long,您可能会收到编译器警告。

相反,将您的验证更改为:

OCMVerify([[schoolMock ignoringNonObjectArgs] startTime:0]);

ignoringNonObjectArgs 顾名思义:startTime 期望的非对象参数将被完全忽略。我通常使用 0 来获得一致且不会混淆的占位符值,但理论上你可以在验证中放入任何你想要的 long long,只要你的模拟对象调用了该方法,它就会通过。

【讨论】:

  • 我试过你的答案,但我现在收到错误Method startTime:0 was not invoked。我在这行代码上添加了一个断点,我确定它正在调用模拟的学校实例。
【解决方案2】:

OCMock 文档对此非常清楚,我认为:“不能使用任何占位符忽略既不是对象也不是指针或选择器的参数。” (Section 4.1)。

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2014-12-18
    • 2020-03-15
    • 1970-01-01
    • 2020-03-08
    • 2013-09-25
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多