Протестируйте асинхронный звонок через гугл тесты - PullRequest
1 голос
/ 02 апреля 2019

У меня есть класс Communicator, который проверяет, может ли он подключиться к тестовому серверу.Вот как я это называю:

class CommunicatorTest
{
public:
    CommunicatorTest() {}
    bool doTest()
    {
        bool _success;
        Parameters params;
        Communicator communicator;
        communicator.connect(params, [this, &_success](bool success)
        {
            statusCode = errorCode;
            m_condition.notify_one();
        });

        std::unique_lock<std::mutex> uGuard(m_mutex);
        m_condition.wait(uGuard);
        return _success;
    }

private:
    std::mutex m_mutex;
    std::condition_variable m_condition;
};

bool communicatorTest()
{
    CommunicatorTest test;
    bool success = test.doTest();
    return success;
}

TEST(CommunicatorTest, test_eq)
{
    EXPECT_EQ(communicatorTest(), true);
}

Я пытался использовать условие и мьютекс, чтобы сделать этот код синхронным, но он не работает, журналы говорят только о том, что тест был запущен и сразу завершается.

Есть ли способ протестировать переменную успеха из обратного вызова с помощью тестов Google?Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2019

В этих случаях лучшее решение - создать макет, имитирующий поведение сервера.Вы не должны полагаться (если не крайне необходимо) на внешние состояния при выполнении ваших тестов.

Тесты могут не пройти, потому что сервер не подключен, нет подключения к Интернету или что-то еще.

Вы можете использовать что-то вроде Google Mock , теперь часть 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
}     
...