为单元测试操作内部函数的返回值

Manipulating return value of inner function for unit testing?

本文关键字:返回值 内部函数 操作 单元测试      更新时间:2023-10-16

我目前正试图为一些遗留代码编写单元测试。在一个函数中,它会调用另一个函数。根据内部函数的返回值,存在三个分支条件。代码是用c++编写的,我使用的是cxxtest框架。如何在不进入实现的情况下操作内部函数的返回值,从而通过所有分支条件?我倾向于避免函数之间的依赖关系。有什么办法可以做到吗?

函数之间已经存在依赖关系。一个呼叫另一个

解决方法是改变外部函数,将内部函数作为参数。然后你可以传入一个函数,它在测试时返回任何你想要的值,在应用程序的其余部分传入有用的函数。

可能在编译时绑定,例如

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。在文件中添加了与socket函数相同语法的函数,如下所示:

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文件的头文件中。瞧,通过操纵参数中的一个值,我就能够模拟所需的函数了。为用户定义函数添加mock也以同样的方式工作。