指针容器的元素匹配器

Gmock Element Matcher for Container of Pointers

本文关键字:元素 指针      更新时间:2023-10-16

在我的单元测试中,我想测试一个GameLauncher基于CharacterSelections创建一个包含一些Object s的Game。在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-equality),我不能简单地使用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)));