C++ 通过googletests测试异步调用

C++ 通过googletests测试异步调用,c++,asynchronous,googletest,C++,Asynchronous,Googletest,我有一个类通信器,测试它是否可以连接测试服务器。我这样称呼它: 类通信测试 { 公众: CommunicatorTest(){} booldotest() { 成功; 参数参数; 沟通者; communicator.connect(参数[this,&_success](bool success) { 状态代码=错误代码; m_条件。通知_one(); }); std::唯一锁uGuard(m_互斥); m_条件。等待(uGuard); 回归成功; } 私人: std::mutex m_mute

我有一个类通信器,测试它是否可以连接测试服务器。我这样称呼它:

类通信测试
{
公众:
CommunicatorTest(){}
booldotest()
{
成功;
参数参数;
沟通者;
communicator.connect(参数[this,&_success](bool success)
{
状态代码=错误代码;
m_条件。通知_one();
});
std::唯一锁uGuard(m_互斥);
m_条件。等待(uGuard);
回归成功;
}
私人:
std::mutex m_mutex;
std::条件变量m_条件;
};
bool communicatorTest()
{
通讯测试;
bool success=test.doTest();
回归成功;
}
测试(通信测试、测试均衡)
{
EXPECT_EQ(communicatorTest(),true);
}
我试图使用条件和互斥使代码同步,但失败了,日志中只显示测试正在运行并立即完成

有没有一种方法可以使用googletests从回调中测试success变量?
提前感谢。

在这些情况下,最好的解决方案是创建模拟服务器行为的模拟。运行测试时,不应依赖外部状态(除非非常必要)

测试可能会失败,因为服务器未连接、没有internet连接或任何情况

您可以使用Google测试套件的一部分来模拟行为:

class MockServer : public Server  {
 public:
  MOCK_METHOD2(DoConnect, bool());
  ....
};
然后像这样做:

TEST(ServerTest, CanConnect) {
  MockServer s;                          
  EXPECT_CALL(s, DoConnect())              
      ..WillOnce(Return(true));

  EXPECT_TRUE(server.isConnected());
}     
您可以模拟错误处理:

TEST(ServerTest, CannotConnect) {
  MockServer s;                          
  EXPECT_CALL(s, DoConnect())              
      ..WillOnce(Return(false));

  EXPECT_FALSE(server.isConnected());
  // ... Check the rest of your variables or states that may be false and
  // check that the error handler is working properly
}     

作为一个编写异步代码的人,我多次偶然发现这个问题——似乎大多数现有的C/C++测试框架都不支持测试异步代码。主要需要的是一个事件循环,您可以在其中安排要执行的事情(模拟定时外部事件等),以及一个注册响应并可选地检查响应发生顺序的机制。因此,我没有试图以某种方式采用现有的框架(这可能会导致更大的努力),而是创建了自己的框架。我一直在用它来测试我开发的类似javascript的promise类,它对我来说做得很好。如果您感兴趣,我刚刚在GitHub上发布了:

谢谢,解释得很好。
TEST(ServerTest, CannotConnect) {
  MockServer s;                          
  EXPECT_CALL(s, DoConnect())              
      ..WillOnce(Return(false));

  EXPECT_FALSE(server.isConnected());
  // ... Check the rest of your variables or states that may be false and
  // check that the error handler is working properly
}