emock icon indicating copy to clipboard operation
emock copied to clipboard

当测函数有多个参数时还可以指定出参吗?

Open hahhhhh opened this issue 1 year ago • 11 comments

比如测试函数 void function(int in1, int2, int &out1, int &out2),可以分别指定出参out1 out2为某个值吗

hahhhhh avatar Aug 19 '22 07:08 hahhhhh

引用传值可以用在.with里面加outBound(obj, <输入参数约束>)把传入的obj变量来输出 这里的输入参数约束就像any()eq(1)之类

或者也可以用.invoke(mocker),设置指定的mock函数来完成需要的功能

orca-zhang avatar Aug 19 '22 17:08 orca-zhang

就是比如只想指定out2的出参,out1不管,那么.with(outBound(var, <输入参数约束>)) 这里的输入参数约束该怎么指定为out2呢

hahhhhh avatar Aug 22 '22 03:08 hahhhhh

.with(any(), any(), any(), outBound(var, <输入参数约束>))

这里的out2对应var

orca-zhang avatar Aug 22 '22 07:08 orca-zhang

试了下没问题,但是我发现如果在多个test宏中mock了同一个函数,每次返回不同值,但实际这个函数每次的返回值都只会按第一次mock时指定的参数来。也就是说不同的test宏所mock的函数会相互影响,这个有办法避免么?只让mock的函数在当前的test宏里生效

hahhhhh avatar Aug 22 '22 08:08 hahhhhh

没有看太明白,每一个EMOCK对应都是一条单独的mock规范,如果想要有多种返回,可以设置多条不同规则的规范,比如在参数满足某些条件的时候才生效


只让mock的函数在当前的test宏里生效

这个本来应该有一个caller约束的,能够约定调用者是某个函数的时候才能生效,不过目前是作废状态,还待修复

orca-zhang avatar Aug 22 '22 11:08 orca-zhang

再问一下,我看到以前也有人问到常函数的mock,现在可以直接mock了吗,我试了以前说的用全局函数的方式并不行

hahhhhh avatar Aug 25 '22 08:08 hahhhhh

https://github.com/ez8-co/emock/commit/b7f60efbb06de9d4c0c8a01814d817d7b72f5200 https://github.com/ez8-co/emock/commit/14707f43606491b6d05ca8d6ee53bbe225b95c9d 这两个提交增加了常成员函数的支持,感谢反馈

可以参考例子:https://github.com/ez8-co/emock/blob/c0fa6b67673fa9eddda8e3c9f174c61a6a1fb01d/tests/ut/TestNonvirtualMethodMocker.h#L157

orca-zhang avatar Aug 26 '22 02:08 orca-zhang

.with(eq(const_cast<CUT const*>(&cut)), eq(2)) 例子的代码中这里如果无法拿到cut,能否配合spy拿到常函数被调用时cut的地址

hahhhhh avatar Aug 27 '22 03:08 hahhhhh

image 举个例子,我需要对class A的normal_method_1函数做测试,但是函数里却调用了class B的常函数,这种常函数的mock可以实现吗

hahhhhh avatar Aug 27 '22 03:08 hahhhhh

可以呀,.with这个可以不写的,也就是全局生效,不匹配指定的对象

EMOCK(&CUT::normal_method_2)
      .stubs()
      .will(invoke(normal_method_2));

像例子的eq(const_cast<CUT const*>(&cut))条件也可以写成any()来实现匹配任意的CUT const对象

EMOCK(&CUT::normal_method_2)
      .stubs()
      .with(any(), eq(2))
      .will(invoke(normal_method_2));

这种情况下,主要是为了说明后面第二个参数的eq(2),所以第一个参数要有一个占位,否则可以直接不写.with

orca-zhang avatar Aug 28 '22 15:08 orca-zhang

好的,感谢大佬

hahhhhh avatar Aug 29 '22 02:08 hahhhhh