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

时间:2016-06-29 10:45:11

标签: c++ unit-testing cxxtest

我目前正在尝试为一些遗留代码编写单元测试。在我的一个函数中,它调用另一个函数。根据内部函数的返回值,存在三个分支条件。代码是用C ++编写的,我使用的是cxxtest框架。如何操作内部函数的返回值而不进入它的实现,以便我可以通过所有分支条件?我更喜欢避免函数之间的依赖关系。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

这些功能之间已存在依赖关系。一个人打电话给对方。

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

可能在编译时绑定它,例如

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>();

如果您愿意,可以在运行时使用函数指针执行此操作。我可能会添加另一个包装器来隐藏客户端代码中的模板。

答案 1 :(得分:1)

我找到了解决方案。我创建了一个名为new_header.hpp的新头文件。在文件中添加了具有与套接字函数相同的语法的函数,如下所示:

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