В моих модульных тестах я хочу проверить, что 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;
}
Вы можете использовать Pointee
соответствие разыменовать указатели:
EXPECT_THAT(inGameObjects,
UnorderedElementsAre(Pointee(*character0),
Pointee(*character1),
Pointee(*character2)));