【问题标题】:Do not combine generators in Catch2 test case不要在 Catch2 测试用例中组合生成器
【发布时间】: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


【解决方案1】:

您应该将输入/输出测试数据包装在某种结构中,该结构将同时定义startPosexpectedMove,而不是使用多个生成器。然后您可以使用单个生成器来生成数据集。您的数据将被命名,因此您不必通过索引来引用它。您的TEST_CASE 可能如下所示:

struct TestData
{
    Position startPos;
    Position expectedMove;
};

TEST_CASE("Test legal moves on empty 2x1 board")
{
    Board board {2, 1};
    auto testData = GENERATE(TestData {{0, 0}, {1, 0}}, TestData {{1, 0}, {0, 0}});
    auto lagalMoves = board.getLegalMoves(testData.startPos);
    REQUIRE(lagalMoves[0] == testData.expectedMove);
}

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多