【问题标题】:Gmock Element Matcher for Container of Pointers用于指针容器的 Gmock 元素匹配器
【发布时间】:2014-06-16 08:32:30
【问题描述】:

在我的单元测试中,我想测试一个GameLauncher 创建一个包含一些Objects 的Game,基于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-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;
}

【问题讨论】:

  • 我知道一种解决方法是将元素值添加到另一个向量中并进行比较,但那是代码异味。

标签: c++ pointers containers matcher gmock


【解决方案1】:

您可以使用Pointee 匹配器来取消引用指针:

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

【讨论】:

  • 由于 Object 具有纯虚函数,我收到编译错误,并且在取消引用指针时失败。我还不能确认这是否有效,但如果可以的话,我会接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
相关资源
最近更新 更多