我正在使用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仍在验证传递给函数的参数的确切值。 为什么?
答案 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)。