簡體   English   中英

如何使用谷歌測試測試 class?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM