我有一些單元測驗可以驗證某些值是否等于 0。在某些情況下,它們應該為 0,而在某些情況下,它們不是。
就像下面這樣:testA期望valueA不包含 0 而testB期望不包含valueB。
我要做的是以某種方式將驗證部分包裝在一個函式中,因此我不是為每個成員呼叫EXPECT_NE/ EXPECT_EQ,而是呼叫一個處理驗證部分的函式。
TEST(UnitTest, testA)
{
Object object;
// do stuff that modified object's values
EXPECT_NE(object.valueA, 0);
EXPECT_EQ(object.valueB, 0);
}
TEST(UnitTest, testB)
{
Object object;
// do stuff that modified object's values
EXPECT_EQ(object.valueA, 0);
EXPECT_NE(object.valueB, 0);
}
這是我想出的,但它有點太冗長了。想知道是否有更好的方法?
void Validate(Object* obj, bool valA, bool valB)
{
// verify valueB
if (valA)
{
EXPECT_EQ(object->valueA, 0);
}
else
{
EXPECT_NE(object->valueA, 0);
}
// verify valueB
if (valB)
{
EXPECT_EQ(object->valueB, 0);
}
else
{
EXPECT_NE(object->valueB, 0);
}
}
TEST(UnitTest, testA)
{
Object object;
// do stuff that modified object's values
Validate(&object, false, true);
}
TEST(UnitTest, testB)
{
Object object;
// do stuff that modified object's values
Validate(&object, true, false);
}
uj5u.com熱心網友回復:
具有FieldsAre結構化系結
使用 C 17 和最近的 GoogleTest 版本 ( >= v1.12.0 ),您可以簡單地使用FieldsAre(), 以防Object允許結構化系結(請參閱實時示例):
using ::testing::FieldsAre;
using ::testing::Eq;
using ::testing::Ne;
struct Object
{
int valueA;
int valueB;
};
TEST(UnitTest, testA)
{
Object object{42,0};
EXPECT_THAT(object, FieldsAre(Ne(0), Eq(0)));
}
TEST(UnitTest, testB)
{
Object object{0, 42};
EXPECT_THAT(object, FieldsAre(Eq(0), Ne(0)));
}
與匹配器的組合
否則(如果您的 GoogleTest 太舊或Object不允許結構化系結),您可以撰寫一個簡單的類似匹配器的函式:
using ::testing::Field;
using ::testing::AllOf;
template <class M1, class M2>
auto MatchesValues(M1 m1, M2 m2)
{
return AllOf(Field(&Object::valueA, m1), Field(&Object::valueB, m2));
}
并像FieldsAre(現場示例)一樣使用它:
TEST(UnitTest, testA)
{
Object object{42,0};
EXPECT_THAT(object, MatchesValues(Ne(0), Eq(0)));
}
TEST(UnitTest, testB)
{
Object object{0, 42};
EXPECT_THAT(object, MatchesValues(Eq(0), Ne(0)));
}
使用自定義匹配器
如評論中所述,您的原件Object是模板,在這種情況下Field無法使用。在這種情況下,您可以像這樣撰寫適當的客戶匹配器(現場示例):
template<typename T>
struct Object
{
int valueA;
int valueB;
T otherStuff;
Object(int a, int b) : valueA(a), valueB(b) {}
};
MATCHER_P2(MatchesValues, m1, m2, "")
{
return ExplainMatchResult(m1, arg.valueA, result_listener)
&& ExplainMatchResult(m2, arg.valueB, result_listener);
}
TEST(UnitTest, testA)
{
Object<int> object{42,0};
EXPECT_THAT(object, MatchesValues(Ne(0), Eq(0)));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/515025.html
標籤:C 单元测试谷歌测试
下一篇:使用干凈架構進行單元測驗
