我正在單元測驗中通過 a 驗證Object(Values存盤類的內部狀態)的私有成員,MATCHER但是我有以下問題:
- 我創建
GetValueA()和GetValueB()公開介面只是為了讓單元測驗可以在MATCHER. 聽起來不是一個正確的想法(特別是如果它不應該公開公開),但有沒有辦法以某種方式訪問valueA??和valueB內部MATCHER而無需創建公共方法?(也許可以設定為私有/受保護,所以它不會公開)
MATCHER_P2可以帶入Object類,但呼叫者將如何呼叫它?
現場樣品
template<typename T>
class Object
{
// internal to the class
struct Values
{
int valueA = 100;
int valueB = 0;
};
Values values = {};
T otherStuff;
public:
// only exposing for the sake of Unit test access
int GetValueA() const
{
return values.valueA;
}
int GetValueB() const
{
return values.valueA;
}
};
MATCHER_P2(Match, m1, m2, "")
{
return ExplainMatchResult(m1, arg.GetValueA(), result_listener) &&
ExplainMatchResult(m2, arg.GetValueB(), result_listener);
}
class UnitTest
{
TEST(UnitTest, testA)
{
Object<int> object;
EXPECT_THAT(object, Match(Ne(0), Eq(0)));
}
};
uj5u.com熱心網友回復:
您可以將私有成員傳遞給匹配器,并將測驗定義為朋友類。
也使用FRIEND_TEST宏而不是friend class.
template<typename T>
class Object
{
// internal to the class
struct Values
{
int valueA = 42;
int valueB = 0;
};
FRIEND_TEST(UnitTest, testA);
Values values = {};
T otherStuff;
};
MATCHER_P2(Match, m1, m2, "")
{
return ExplainMatchResult(m1, arg.valueA, result_listener) &&
ExplainMatchResult(m2, arg.valueB, result_listener);
}
TEST(UnitTest, testA)
{
Object<int> object;
EXPECT_THAT(object.values, Match(Ne(0), Eq(0)));
}
現場示例:https ://godbolt.org/z/WWr3vrWsn
uj5u.com熱心網友回復:
正如評論中提到的,原則上對私人成員進行單元測驗并不是最好的主意,但有時這就是你想要/需要的。
如果是這種情況,您可能希望將 testclass 設為朋友類:
template<typename T>
class Object
{
friend class UnitTest_testA_Test; // pay attention to the name
// it should be Test at the end (Uppercase 'T')
struct Values
{
int valueA = 42;
int valueB = 0;
};
};
TEST(UnitTest, testA)
{
Object<int> object;
EXPECT_EQ(42, object.values.valueA);
}
而且由于您想使用匹配器:
MATCHER_P2(Match, m1, m2, "")
{
return ExplainMatchResult(m1, arg.values.valueA, result_listener) &&
ExplainMatchResult(m2, arg.values.valueB, result_listener);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/518430.html
標籤:C 单元测试谷歌测试
