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

В моих модульных тестах я хочу проверить, что GameLauncher создает Game содержащий некоторые Objectс, на основе 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-контейнерное равенство), Я не могу просто использовать 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

Решение

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

EXPECT_THAT(inGameObjects,
UnorderedElementsAre(Pointee(*character0),
Pointee(*character1),
Pointee(*character2)));
1

Другие решения


По вопросам рекламы [email protected]