1

我想测试 makeTvSeries() 方法而不提取 getNumberOfShows、printMsg 到其他类然后模拟它,所以我想模拟 TvChannel 类。

是否可以调用将调用子方法的基类方法(makeTvSeries):getNumberOfShows、printMsg 而无需摆脱虚拟性?所以我可以在其他测试中使用相同的模拟类定义,例如 foo.playTvSeries(mockTvChannel) 并期望调用 makeTvSeries?。

此外,我在做什么是好的做法吗?在整个程序中,还有其他使用 cin 和 cout 的类,正如我在开始时所说的那样,我不想将它们全部提取到一个负责输入/输出的类中。你的经历是什么,我应该怎么做?

class MockTvChannel : public TvChannel{
public:
    MOCK_METHOD0(getNumberOfShows, int());
    //MOCK_METHOD0(makeTvSeries, void());
    MOCK_METHOD0(printMsg, void());
};

TEST(sample_test_case, sample_test)
{
    MockTvChannel channel;
    EXPECT_CALL(channel, getNumberOfShows())
        .Times(1)
        .WillOnce(::testing::Return(10));

    EXPECT_CALL(channel, printMsg())
        .Times(10);

    channel.makeTvSeries();
}    


class TvChannel
{
protected:
    virtual int getNumberOfShows(){
        int nShows;
        std::cin >> nShows;
        return nShows;
    }

    virtual void printMsg(){
        std::cout << "What a show!" << std::endl;
    }

public:
    /*virtual*/ void makeTvSeries()
    {
        int nShows = getNumberOfShows();
        for(int i = 0; i<nShows; ++i){  
            printMsg();
        }
    }
    virtual ~TvChannel() {};
};
4

1 回答 1

1

所以我可以在其他测试中使用相同的模拟类定义,例如 foo.playTvSeries(mockTvChannel) 并期望调用 makeTvSeries?

是的你可以。你的实现很好。

我在做什么是好习惯吗?

这是。遵循SOLID 原则,您应用了以下原则:

  • LSP:在单元测试中,您切换了实际实现并使用模拟进行了测试,因此您的 makeTvSerier 可以工作
  • ISP:你的班级有一个接口
  • DIP:我猜,当你将模拟实例传递给其他对象时,你想使用控制反转
于 2013-09-27T08:08:00.937 回答