Net*_*rix 5 c++ unit-testing googletest googlemock
我正在使用Give / 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);
}
Run Code Online (Sandbox Code Playgroud)
但是对于模拟,由于在给定部分中出现了一些期望,所以它变得不再清晰。给定部分假定是设置步骤。请看一个例子:
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);
}
Run Code Online (Sandbox Code Playgroud)
这种方法正确吗?应在何时将“给定/何时/然后”注释放置在测试代码中?
宏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);
}
Run Code Online (Sandbox Code Playgroud)
如果您实际上希望测试被测系统与其他协作者之间的迭代,则可以使用“安排-期望-行动”模式:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |