如何用 google 测试来测试 class?

How to test a class with google test?

刚学google测试,我有一个class,想测试一下它的成员函数,下面是演示代码:

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?
}

这是第一个问题。

第二个问题是:

在某些情况下,我必须先调用另一个成员函数来获取一个值,然后使用EXPECT_EQ测试当前成员函数,如何在不使用其他成员的情况下测试一个函数功能?如果有必要?

您只需验证 A 的状态是否已按需要更改。 所以只需检查它是否包含添加的对象。

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 的行为。因此,您正在验证其他函数在状态更改后执行其他操作。

不要想着把测试与生产交朋友 class。这是不好的做法,因为这会使测试与实现细节纠缠在一起。当测试检查实现细节时,您将无法重构生产代码。

这里是我经常做的小测试重构,以提高维护测试的容易程度:https://godbolt.org/z/Tc1n9Evzs