如何忽略传入被测函数的参数的实际值

时间:2016-06-03 12:59:29

标签: ios objective-c unit-testing ocmock

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

我只是想验证函数是否被调用而不考虑传入的参数值

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

[school startTime:currentTime];

(简短说明:学校班级-(void)startTime:(long long)中的功能采用long long类型参数)

在我的测试案例中,我尝试过:

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

我很确定调用的代码已被调用,但是我收到错误:  OCMockObject(School):Method startTime:2005634354 was not invoked

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

2 个答案:

答案 0 :(得分:0)

class foo { public: private: int x; friend class bar; }; void bar::set(int x) { foodoo[0].x = x; } 转换为类型[OCMArg any]会将(long long)对象转换为值2005634354,这就是测试期望作为参数的原因。 OCMock期待一个非对象参数,startTime不支持该参数。如果将转换移到[OCMArg any],您可能会收到编译器警告。

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

long long

OCMVerify([[schoolMock ignoringNonObjectArgs] startTime:0]); 将按照名称暗示:ignoringNonObjectArgs所期望的非对象参数将被完全忽略。我通常使用0来获得一致且不会混淆的占位符值,但理论上你可以在验证中放置任何你想要的startTime,并且只要模拟对象调用该方法,它就会通过。

答案 1 :(得分:0)

OCMock文档很清楚这一点,我认为:"使用任何占位符都不能忽略既不是对象也不是指针或选择器的参数。" (Section 4.1)。