2013-09-27 111 views
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() {}; 
}; 

回答

1

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

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

这是一个很好的做法,我在做什么?

它是。继SOLID principle,你申请下一个原则:

  • LSP:在单元测试你切换真正实现和使用模拟测试,因此您makeTvSerier工作
  • ISP:你们班有一个接口
  • DIP:我猜,当您将模拟实例传递给其他对象时,您想要使用控制反转