Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ HippoMocks通过ref模拟返回值 类IEEmployeeServiceProxy { 公众: 虚拟~IEmployeeServiceProxy(){} 虚拟无效的AddEmployee(const Employee&)=0; 虚拟整数GetEmployees(std::vector&)=0; }; 结构雇员 { boost::uuids::uuid Id; std::字符串名; }; m_Mocks.ExpectCall(m_EmpSvcMock.get(),IEEmployeeServiceProxy::GetEmployees).Return???;_C++_Unit Testing_Mocking_Hippomocks - Fatal编程技术网

C++ HippoMocks通过ref模拟返回值 类IEEmployeeServiceProxy { 公众: 虚拟~IEmployeeServiceProxy(){} 虚拟无效的AddEmployee(const Employee&)=0; 虚拟整数GetEmployees(std::vector&)=0; }; 结构雇员 { boost::uuids::uuid Id; std::字符串名; }; m_Mocks.ExpectCall(m_EmpSvcMock.get(),IEEmployeeServiceProxy::GetEmployees).Return???;

C++ HippoMocks通过ref模拟返回值 类IEEmployeeServiceProxy { 公众: 虚拟~IEmployeeServiceProxy(){} 虚拟无效的AddEmployee(const Employee&)=0; 虚拟整数GetEmployees(std::vector&)=0; }; 结构雇员 { boost::uuids::uuid Id; std::字符串名; }; m_Mocks.ExpectCall(m_EmpSvcMock.get(),IEEmployeeServiceProxy::GetEmployees).Return???;,c++,unit-testing,mocking,hippomocks,C++,Unit Testing,Mocking,Hippomocks,如何模拟它,使它通过参数而不是int(方法的返回类型)返回std::vector 另外,如果有多个ref参数,该怎么办?您必须自己为引用提供对象,确保mock使用和来使用它,并且您可以通过传递函数将其更改为Do,这也提供了返回值。有多少引用参数并不重要。例如: class IEmployeeServiceProxy { public: virtual ~IEmployeeServiceProxy() { } virtual void AddEmployee(const Emplo

如何模拟它,使它通过参数而不是int(方法的返回类型)返回std::vector


另外,如果有多个ref参数,该怎么办?

您必须自己为引用提供对象,确保mock使用
来使用它,并且您可以通过传递函数将其更改为
Do
,这也提供了返回值。有多少引用参数并不重要。例如:

class IEmployeeServiceProxy
{
public:
    virtual ~IEmployeeServiceProxy() { }
    virtual void AddEmployee(const Employee&) = 0;
    virtual int GetEmployees(std::vector<Employee>&) = 0;
};

struct Employee
{
    boost::uuids::uuid Id;
    std::string Name;
};

m_Mocks.ExpectCall(m_EmpSvcMock.get(), IEmployeeServiceProxy::GetEmployees).Return???;
int AddSomeEmployees(std::vector&v)
{
v、 推回(雇员());
返回0;
}
//测试代码
std::vectorarg;
ExpectCall(empscmock,IEEmployeeServiceProxy::GetEmployees).With(arg.Do)(AddSomeEmployees);

请注意,
Do
可以使用任何类型的函数,也可以使用std::function、lambdas等。

您必须自己提供引用对象,确保mock使用
来使用它,并且您可以通过传递函数将其更改为
Do
,这也提供了返回值。有多少引用参数并不重要。例如:

class IEmployeeServiceProxy
{
public:
    virtual ~IEmployeeServiceProxy() { }
    virtual void AddEmployee(const Employee&) = 0;
    virtual int GetEmployees(std::vector<Employee>&) = 0;
};

struct Employee
{
    boost::uuids::uuid Id;
    std::string Name;
};

m_Mocks.ExpectCall(m_EmpSvcMock.get(), IEmployeeServiceProxy::GetEmployees).Return???;
int AddSomeEmployees(std::vector&v)
{
v、 推回(雇员());
返回0;
}
//测试代码
std::vectorarg;
ExpectCall(empscmock,IEEmployeeServiceProxy::GetEmployees).With(arg.Do)(AddSomeEmployees);
请注意,
Do
可以使用任何类型的函数,也可以使用std::function、lambdas等。

Git版本(最新版本)有一个用于Out参数的选项,这些参数与此非常相似。使用

int AddSomeEmployees( std::vector< Employee >& v )
{
  v.push_back( Employee() );
  return 0;
}

  //test code
std::vector< int > arg;

mocks.ExpectCall( empSvcMock, IEmployeeServiceProxy::GetEmployees ).With( arg ).Do( AddSomeEmployees );
std::vector args;参数。推回(1);参数。推回(2);
ExpectCall(mock,IInterface::function).With(Out(arg));
Git版本(最新版本)有一个Out参数选项,这些参数基本上就是这样。使用

int AddSomeEmployees( std::vector< Employee >& v )
{
  v.push_back( Employee() );
  return 0;
}

  //test code
std::vector< int > arg;

mocks.ExpectCall( empSvcMock, IEmployeeServiceProxy::GetEmployees ).With( arg ).Do( AddSomeEmployees );
std::vector args;参数。推回(1);参数。推回(2);
ExpectCall(mock,IInterface::function).With(Out(arg));

啊,这很有帮助!谢谢。您可以添加一个通过C++0x/11 lambdas实现的示例吗?我尝试了
Do([]->int(std::vector&employees){})
,但GCC 4.5.3一直抱怨没有与TCall.Do(…)匹配的函数。发现了问题。这是HippoMocks将Do的参数声明为ref,并且不允许引用temp lambda。向Dascandy提交了补丁。啊,这很有帮助!谢谢。您可以添加一个通过C++0x/11 lambdas实现的示例吗?我尝试了
Do([]->int(std::vector&employees){})
,但GCC 4.5.3一直抱怨没有与TCall.Do(…)匹配的函数。发现了问题。这是HippoMocks将Do的参数声明为ref,并且不允许引用temp lambda。已向Dascandy提交修补程序。Git版本与SVN版本类似吗?如果没有,我在哪里可以得到Git版本(最好是tarballed)?是我上次自己测试的git版本(Github上有一个更新的提交分支,但它包含一些我还没有检查的更改)。它应该是类似的,但更新。据我记忆所及,唯一真正改变(与添加的相反)的是,类mock不再初始化成员,但有一个新函数MemberMock替代了它。您可能以前没有使用过它,因为它不是一个典型的东西。@dascandy您知道hippomocks是否仍在积极开发吗?@stjin:dascandy是开发人员:)Git版本与SVN版本类似吗?如果没有,我在哪里可以得到Git版本(最好是tarballed)?是我上次自己测试的git版本(Github上有一个更新的提交分支,但它包含一些我还没有检查的更改)。它应该是类似的,但更新。据我记忆所及,唯一真正改变(与添加的相反)的是,类mock不再初始化成员,但有一个新函数MemberMock替代了它。你以前可能没有用过这个,因为它不是一个典型的东西。@dascandy你知道hippomocks是否还在积极开发吗?@stjin:dascandy是开发人员:)