Gmock Element Matcher для контейнера указателей

0

В моих модульных тестах я хочу проверить, что GameLauncher создает Game содержащую некоторый Object s, основанный на CharacterSelections. В псевдокоде с Java-ароматом тест будет:

Game game = gameLauncher.createGame(characterSelections);

assertThat(game.getObjects(), containsInAnyOrder(c1, c2, c3));

Когда я работаю в c++, game->getObjects() возвращает vector<Object*>. Я использую вектор указателей, поскольку Object является полиморфным типом.

GMock # ContainerMatchers дает список сокетов для контейнеров. Поскольку контейнеры STL используют operator== для определения равенства между его элементами (см. Github/cpp-container-равенство), я не могу просто использовать UnorderedElementsAre (...), поскольку это будет выполнять сравнения указателей.

Какие у меня варианты?

// redacted includes

class GameLauncherTest : public testing::Test {
    // ... redacted ...
};

TEST_F(GameLauncherTest, launchesGameWithCharacterInstanceForSelectedCharacters) {
    auto const characterSelections = new CharacterSelections();
    characterSelections->add(new CharacterSelection(0, false, 1));
    characterSelections->add(new CharacterSelection(3, false, 0));
    characterSelections->add(new CharacterSelection(2, true, 1));

    Game* const game = this->gameLauncher->launchGame(characterSelections);

    auto const character0 = new Character(0, objectData1);
    auto const character1 = new Character(1, objectData0);
    auto const character2 = new Character(2, objectData1);

    const vector<Object*> inGameObjects = game->getObjects();

    // fails
    EXPECT_THAT(inGameObjects, UnorderedElementsAre(character0, character1, character2));

    delete character0;
    delete character1;
    delete character2;
    delete characterSelections;
}
  • 0
    Я знаю, что обходной путь - это добавить значения элементов в другой вектор и сравнить их, но это запах кода.
Теги:
pointers
containers
gmock
matcher

1 ответ

1
Лучший ответ

Вы можете использовать Pointee для разыменования указателей:

EXPECT_THAT(inGameObjects,
            UnorderedElementsAre(Pointee(*character0),
                                 Pointee(*character1),
                                 Pointee(*character2)));
  • 0
    Я получаю ошибки компиляции из-за того, что Object имеет чисто виртуальные функции, и он перестает работать при разыменовании указателя. Я пока не могу подтвердить, что это работает, но когда смогу, я приму ответ, если это произойдет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню