1

getNumberOfShows, printMsg を他のクラスに展開してモックせずに makeTvSeries() メソッドをテストしたいので、TvChannel クラスをモックしようと思いました。

仮想性を取り除くことなく、子メソッド getNumberOfShows、printMsg を呼び出す基本クラス メソッド (makeTvSeries) を呼び出すことは可能ですか? したがって、たとえば foo.playTvSeries(mockTvChannel) などの他のテストで同じモック クラス定義を使用して、makeTvSeries? の呼び出しを期待できます。

さらに、私がやっていることは良い習慣ですか?プログラム全体には、cin と cout を使用する他のクラスもあり、最初に述べたように、それらすべてを入出力を担当する 1 つのクラスに抽出したくありませんでした。あなたの経験と私は何をすべきか?

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 に答える