[英]How to test a class with google test?
我只是在學習谷歌測試,我有一個class
,我想測試它的成員 function,下面是演示代碼:
class B {
//......
};
class A {
public:
//.....
void add (string s, B* ptrb) { m.insert(s, ptrb); }
void remove(string s) {
auto it = m.find(s);
if (it != m.end())
m.erase(it);
}
B* operator[](string s)
{
auto it = m.find(s);
if (it != m.end())
return (*it).second;
}
//.....
protected:
map<B*> m;
//.....
}
如果我想像這樣測試add
:
class mygtest : public ::testing::Test
{
protected:
//....setup
//....teardown
A a;
};
TEST_F(mygtest, testadd)
{
B b1;
B b2;
a.add("1", &b1);
a.add("2", &b2);
//...how should i do next?
EXPECT_EQ(.....) //compare with who?
}
這是第一個問題。
第二個問題是:
在某些情況下,我必須先調用另一個成員 function 來獲取值,然后使用EXPECT_EQ
測試當前成員 function,如何在沒有其他成員功能的情況下測試 ZC1C425268E68385D14AB5074C17Z9? 如果有必要?
您只需驗證A
state 是否已根據需要更改。 所以只需檢查它是否包含添加的對象。
TEST_F(mygtest, testadd)
{
B b1;
B b2;
a.add("1", &b1);
a.add("2", &b2);
EXPECT_EQ(a["1"], &b1);
EXPECT_EQ(a["2"], &b2);
EXPECT_EQ(a["3"], nullptr);
}
https://godbolt.org/z/ezrjdY6hh
由於沒有足夠的上下文,所以不可能改進這個測試(它看起來不太好)。
您無法避免使用不同的功能。 您正在測試 class 的行為。 因此,您要驗證其他 function 在 state 更改后是否執行其他操作。
不要想用生產 class 給朋友做個測試。 這是不好的做法,因為這會使測試與實現細節糾纏在一起。 在測試檢查實現細節時,您將無法重構生產代碼。
這是我通常對測試進行的小型重構,以提高測試的維護難度:https://godbolt.org/z/Tc1n9Evzs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.