6

我正在使用 Given/When/Then 模式使测试代码更清晰。由于我使用 C++ 编写这些测试,因此我选择使用 Google Test。通过测试,模式很清楚,因为我这样做:

TEST(TestFixture, TestName)
{
    // Given
    int a = 5;
    int b = 6;
    int expectedResult = 30;

    // When
    int result = Multiply(a, b);

    // Then
    EXPECT_EQ(expectedResult, result);
}

但是有了模拟,它就不再清楚了,因为在给定部分出现了一些期望。Given 部分假设是一个设置步骤。请看一个例​​子:

TEST(TestFixture, TestName)
{
    // Given
    int a = 5;
    int b = 6;
    int expectedResult = 30;

    MightCalculatorMock mock;

    EXPECT_CALL(mock, multiply(a,b))
        .WillOnce(Return(expectedResult));

    // When
    int result = Multiply(mock, a, b);

    // Then
    EXPECT_EQ(expectedResult, result);
}

这种方法正确吗?Given/When/Then 注释应该如何放在测试代码中,在哪里?

4

1 回答 1

3

EXPECT_CALL宏可以被认为是测试一个类和另一个类之间交互的一种方式。因此,如果您将它与另一个EXPECT宏一起使用,那么您的测试可能会测试两件事,这就是为什么它似乎与“Given-When-Then”范式(也称为“ Arrange-Act-Assert ”)冲突.

如果您只需要在模拟对象上设置一些行为以进行测试,请改用ON_CALL宏:

TEST(TestFixture, TestName)
{
    // Given
    int a = 5;
    int b = 6;
    int expectedResult = 30;

    MightCalculatorMock mock;

    ON_CALL(mock, multiply(a,b))
        .WillByDefault(Return(expectedResult));

    // When
    int result = Multiply(mock, a, b);

    // Then
    EXPECT_EQ(expectedResult, result);
}

如果你真的想测试你的被测系统和其他合作者之间的迭代,你可以使用“Arrange-Expect-Act”模式:

TEST(TestFixture, CalculatorIsCalledProperly)
{
    // Arrange
    int a = 5;
    int b = 6;
    int expectedResult = 30;
    MightCalculatorMock mock;

    // Expect
    EXPECT_CALL(mock, multiply(Eq(a),Eq(b)));

    // Act
    int result = Multiply(mock, a, b);
}
于 2013-08-21T05:18:28.683 回答