为单元测试操纵内部函数的 return 值?
Manipulating return value of inner function for unit testing?
我目前正在尝试为一些遗留代码编写单元测试。在我的一个函数中,它调用另一个函数。根据内部函数的 return 值,存在三个分支条件。代码是用 C++ 编写的,我使用的是 cxxtest 框架。如何在不进入内部函数的实现的情况下操纵内部函数的 return 值,以便我可以通过所有分支条件?我更喜欢避免函数之间的依赖关系。有什么办法吗?
函数之间已经存在依赖关系。一呼一唤。
解决方案是将外部函数更改为将内部函数作为参数。然后你可以传入一个函数,returns 测试时你喜欢的任何值以及应用程序其余部分中有用的函数。
可能在编译时绑定它,例如
struct inner_function {int operator()();}
struct mock {int operator ()();}
template <typename F = inner_function>
int outer_function()
{
if (F {}())
return 1;
else
return 2;
}
// in a test
int r = outer_function <mock>();
如果您愿意,可以在运行时使用函数指针执行此操作。我可能会添加另一个包装器来隐藏客户端代码中的模板。
我找到了解决办法。我创建了一个名为 new_header.hpp 的新 header 文件。在文件中添加了一个与套接字函数具有相同语法的函数,如下所示:
int socket(int domain, int type, int protocol)
{
if(domain == CONST1)
return -1;
else if(domain == CONST2)
return 1;
}
然后在 cmake 文件中,我为 运行 UT 创建了一个库。我添加了这个新的 new_header.hpp 和其他必需的文件作为依赖项。此外,我已将此文件包含在我新创建的 UT 文件的 header 中。瞧,通过操纵参数中的一个值,我能够模拟所需的函数。为 user-defined 函数添加模拟也以同样的方式工作。
我目前正在尝试为一些遗留代码编写单元测试。在我的一个函数中,它调用另一个函数。根据内部函数的 return 值,存在三个分支条件。代码是用 C++ 编写的,我使用的是 cxxtest 框架。如何在不进入内部函数的实现的情况下操纵内部函数的 return 值,以便我可以通过所有分支条件?我更喜欢避免函数之间的依赖关系。有什么办法吗?
函数之间已经存在依赖关系。一呼一唤。
解决方案是将外部函数更改为将内部函数作为参数。然后你可以传入一个函数,returns 测试时你喜欢的任何值以及应用程序其余部分中有用的函数。
可能在编译时绑定它,例如
struct inner_function {int operator()();}
struct mock {int operator ()();}
template <typename F = inner_function>
int outer_function()
{
if (F {}())
return 1;
else
return 2;
}
// in a test
int r = outer_function <mock>();
如果您愿意,可以在运行时使用函数指针执行此操作。我可能会添加另一个包装器来隐藏客户端代码中的模板。
我找到了解决办法。我创建了一个名为 new_header.hpp 的新 header 文件。在文件中添加了一个与套接字函数具有相同语法的函数,如下所示:
int socket(int domain, int type, int protocol)
{
if(domain == CONST1)
return -1;
else if(domain == CONST2)
return 1;
}
然后在 cmake 文件中,我为 运行 UT 创建了一个库。我添加了这个新的 new_header.hpp 和其他必需的文件作为依赖项。此外,我已将此文件包含在我新创建的 UT 文件的 header 中。瞧,通过操纵参数中的一个值,我能够模拟所需的函数。为 user-defined 函数添加模拟也以同样的方式工作。