Как настроить макет сервера с помощью GoogleMock - PullRequest
0 голосов
/ 08 января 2019

Я конвертирую старый код C в C ++ и тестирую его при перезаписи с помощью GoogleTest. Часть моего кода использует сокеты для подключения к удаленному хосту с адресом IPV4. У меня много проблем с пониманием того, как я могу использовать GoogleTest и GoogleMock для проверки сокетной части моего кода.

Мой объект принимает IP-адрес хоста и количество секунд ожидания, прежде чем снова попытаться подключиться к хосту. Существует функция с именем "conn ()", которая на самом деле пытается подключиться к хосту. Это функция, которую я хочу проверить. Итак, в моем тесте я хочу сделать что-то вроде:

TEST(CONNECTION_TEST, Connection) 
{
    MyObject obj("###.###.###.###", 1);
    ASSERT_TRUE(obj.conn());
}

Я прочитал здесь, что мне нужно было смоделировать сервер, так как тестирование удаленного хоста на самом деле не рекомендуется. Я новичок в GoogleMock, поэтому читаю официальную документацию и читаю Учебник для начинающих GoogleTest , GoogleMock для чайников , Шпаргалку GoogleMock и Поваренная книга GoogleMock . Я смотрел учебник CodesBay . Я просмотрел несколько сообщений о SO, в том числе Что не так с моими попытками смоделировать простой метод C ++ с помощью googlemock? , Шаблоны для модульного тестирования метода C ++, который вызывает стандартный вызов библиотеки и Как выполнить модульное тестирование разъемов BSD .

Для моего фиктивного сервера я сделал следующее. Я создал класс Socket, который упаковывает socket.h, а затем расширил MockSocket. В моем TEST я настроил фиктивный сокет для приема соединений, например:

TEST(CONNECTION_TEST, Connection)
{

    // bind to local host?
    MyObject obj("0.0.0.0", 1);

    // create the host
    MockSocket mock_sock;
    MockSocket new_sock;
    EXPECT_CALL(mock_sock, create()).Times(1);
    EXPECT_CALL(mock_sock, bind(_));
    EXPECT_CALL(mock_sock, listen());
    EXPECT_CALL(mock_sock, accept(_));
    mock_sock.create();
    mock_sock.bind(123);
    mock_sock.listen();
    mock_sock.accept(new_sock);

    ASSERT_TRUE(obj.conn());
}

Как вы можете сказать, я не знаю, что я делаю. Результаты моего теста не пройдены, и я думаю, что это потому, что я просто не сделал это правильно. Пожалуйста, кто-нибудь может направить меня в правильном направлении? Является ли макет сервера правильным способом проверки моего объекта?

1 Ответ

0 голосов
/ 09 января 2019

Что вы хотите проверить?

Хотите ли вы проверить, может ли класс сокетов TCP / IP (если он есть) действительно подключаться и взаимодействовать с какой-либо службой TCP / IP? Это больше сквозной тест. Для этого вы можете использовать Google Test, но для связи вам нужна работающая служба TCP / IP. Это не то, для чего предназначена система насмешек Google. Это похоже на то, когда вы хотите протестировать класс, который читает файл: вам нужен файл, который он может прочитать, и Google Mocking Framework вам здесь не поможет.

Хотите проверить, работает ли какой-нибудь другой класс, который использует ваш класс сокетов TCP / IP? Здесь вы можете использовать Google Mocking Framework для создания макета для вашего класса сокетов. Этот макет будет выступать в качестве класса сокета для вашего другого класса, но не будет взаимодействовать с TCP / IP. Таким образом, вы можете протестировать другой класс.

...