【发布时间】:2020-02-13 08:55:56
【问题描述】:
我想在Catch2 测试用例中使用多个生成器。我的问题是,当有两个以上的生成器时,它们是“组合的”。所以如果我写这样的东西:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto startPos = GENERATE(Position(0, 0), Position(1, 0));
auto expectedMoves = GENERATE(Position(1, 0), Position(0, 0));
auto legalMoves = board.getLegalMoves(startPos);
REQUIRE(legalMoves[0] == expectedMoves);
}
这将产生四个测试用例:
(startPos[0] vs expectedMoves[0]、startPos[0] vs expectedMoves[1]、startPos[1] vs expectedMoves[0]、startPos[1] vs startPos[1])。
我只想要两个:(startPos[0] vs expectedMoves[0], startPos[1] vs startPos[1])。
有没有一种优雅易读的方式?我想避免这样的事情:
TEST_CASE("Test legal moves on empty 2x1 board") {
Board board(2, 1);
auto dump = GENERATE(vector<Position>{ Position(0, 0), Position(1, 0) },
vector<Position>{ Position(1, 0), Position(0, 0) });
auto expectedMoves = dump[1];
auto legalMoves = board.getLegalMoves(dump[0]);
REQUIRE(legalMoves[0] == expectedMoves);
}
因为维护这种怪物很麻烦。
编辑:我不太喜欢这个解决方案: https://github.com/catchorg/Catch2/blob/ce42deb72fab2be85a862f559984580c24cb76c4/projects/SelfTest/UsageTests/Generators.tests.cpp#L199
【问题讨论】:
-
您能解释一下您的转储解决方案的转储,除了使用向量而不是一些有意义的命名结构和有意义的命名成员吗?
标签: c++ unit-testing catch2