我正在使用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);
}
但是由于在给定部分出现了一些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注释放在测试代码中,在哪里?
答案 0 :(得分:2)
可以将EXPECT_CALL
宏视为测试类与另一个类之间交互的一种方法。因此,如果您将其与另一个EXPECT
宏一起使用,那么您的测试可能会测试两件事,这就是为什么它似乎与“Given-When-Then”范例(也称为“{{ 3}}“)。
如果您只需要在模拟对象上设置某些行为进行测试,请改用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);
}