gpt4 book ai didi

c++ - HippoMocks - 在 "ExpectCallFunc"之后使用 "NeverCallFunc"实现相同的功能会导致意外的 "HippoMocks::ExpectationException"

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:10 26 4
gpt4 key购买 nike

假设我们有一个单元测试,它首先执行我们期望函数 someFunc 不会被调用的代码序列,然后执行我们期望该函数被调用的代码序列恰好一次。使用HippoMocks ,我们可以这样写:

#include <hippomocks.h>

void someFunc (void)
{

}

int main (int argc, char ** argv)
{
MockRepository mocks;
mocks.autoExpect = false;

mocks.NeverCallFunc(someFunc); // line 27

/* some testing code ... */

/* ... in the course of which someFunc does not get called ... */

mocks.ExpectCallFunc(someFunc); // line 33

/* other testing code ... */
someFunc();
/* ... in the course of which someFunc got called */

return 0;
}

但是,当在 Windows 上运行上面的代码片段(使用 Cygwin 工具链编译)时,将抛出一个 HippoMocks::ExpectationException:

terminate called after throwing an instance of 'HippoMocks::ExpectationException'
what(): Function someFunc() called with mismatching expectation!
Expectations set:
../main.cpp(33) Expectation for someFunc() on the mock at 0x0 was not satisfied.
Functions explicitly expected to not be called:
../main.cpp(27) Result set for someFunc() on the mock at 0x0 was used.

所以我想知道...

... (1),如果 HippoMocks 不是为了处理这种情况而设计的。期望 someFunc 被调用(第 33 行)不会替换相应模拟存储库中的先前期望吗?

... (2),为什么第二个期望(第 33 行)没有满足,因为 someFunc 被显式调用。如果有的话,我会期望第一个期望(第 27 行)没有得到满足吗?

有趣的是,事情恰恰相反。以下代码段运行没有任何问题:

#include <hippomocks.h>

void someFunc (void)
{

}

int main (int argc, char ** argv)
{
MockRepository mocks;
mocks.autoExpect = false;

mocks.ExpectCallFunc(someFunc); // line 27

/* some testing code ... */
someFunc();
/* ... in the course of which someFunc got called */

mocks.NeverCallFunc(someFunc); // line 33

/* other testing code ... */

/* ... in the course of which someFunc does not get called ... */

/* someFunc(); */

return 0;
}

此外,如果对 someFunc 的调用被插入到第二个片段中的第二个期望后面(如注释中所示),这将被检测并报告为违反“永不调用”期望正如人们所期望的那样,HippoMocks:

terminate called after throwing an instance of 'HippoMocks::ExpectationException'
what(): Function someFunc() called with mismatching expectation!
Expectations set:
../main.cpp(27) Expectation for someFunc() on the mock at 0x0 was satisfied.
Functions explicitly expected to not be called:
../main.cpp(33) Result set for someFunc() on the mock at 0x0 was used.

HippoMocks 专家的任何帮助将不胜感激......

最佳答案

NeverCallExpectCall 之间的交互之前并没有真正考虑过 - 我从没想过人们会经常使用 NeverCall,所以我没有'意识到相互作用。

在当前发布的版本中,NeverCall 将在之前的 ExpectCall 上获得自动预期,并且将首先检查所有 NeverCall。这导致 ExpectCall/NeverCall 按预期工作 - 即,您首先获得 expect,然后 NeverCall 处于事件状态。在 NeverCall/ExpectCall 的情况下,没有添加 autoexpect 并且 NeverCall 获得优先权。这是违反直觉的,我认为最好交换行为,以便 ExpectCall 在匹配时始终获得优先权。

我已将您的示例添加为新的测试用例并交换了 NeverCallExpectCall 的匹配顺序。我还删除了 NeverCallautoExpect - 因为它一开始就不应该存在。结果是您的两个示例现在都将按照您期望的方式工作,打开或关闭 autoExpect。如果 someCallNeverCall 设置之后,您的第二个示例可以工作。这使您可以比以前更多地对设置代码进行分组。

如果你想测试/切换到这个版本,注意它仍然在cpp11分支上。当确认分支稳定且文档适当扩展时,我会将其合并到 master 和 release 中。目前没有已知的问题。它在 Github 上:https://github.com/dascandy/hippomocks/tree/cpp11 .

关于c++ - HippoMocks - 在 "ExpectCallFunc"之后使用 "NeverCallFunc"实现相同的功能会导致意外的 "HippoMocks::ExpectationException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com