【发布时间】: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