【问题标题】:How to use Given/When/Then pattern with mocks (Google Mock)?如何将 Given/When/Then 模式与模拟(Google Mock)一起使用?
【发布时间】:2013-08-20 22:57:06
【问题描述】:

我使用 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 部分中出现了一些 EXPECT。 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 cmets 应该如何放在测试代码中,放在哪里?

【问题讨论】:

    标签: c++ unit-testing googletest googlemock


    【解决方案1】:

    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);
    }
    

    【讨论】:

    • 谢谢!嗯,我只是喜欢整个模式学:) 无论如何,我将把新模式命名为 AEAC、Arrange、Expect、Act、Check with Check 块,其中检查函数的结果:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多