4、编写控件行为测试代码
接下来应该是编写点击add button和delete button的测试代码了。同样,我们从TestCase继承出TestOperation:
class TestOperation : public CppUnit::TestCase { CPPUNIT_TEST_SUITE(TestOperation); CPPUNIT_TEST(testMovieList); CPPUNIT_TEST(testAdd); CPPUNIT_TEST(testDelete); CPPUNIT_TEST_SUITE_END(); public: void testMovieList(); void testAdd(); void testDelete(); public: void setUp(); void tearDown(); TestOperation(); virtual ~TestOperation(); private: static CString LOST_IN_SPACE; CStringArray m_MovieNames; MovieListWindow* m_pWindow; MovieListEditor* m_pEditor; }; |
你会发现,在TestOperation类中出现了一个成员变量MovieListEditor* m_pEditor。类MovieListEditor是一个用来保存影片数据以及对影片数据进行增加,删除操作的管理类。后面我们会给出它的实现。看看 setUp()做了什么:
void TestOperation::setUp() { //创建一个MovieListEditor实例 m_pEditor = new MovieListEditor(); m_MovieNames.RemoveAll(); //将MovieListEditor中的影片列表拷贝到m_MovieNames,为后面测试作准备 for(int n=0; n<m_pEditor->GetMovies()->GetSize(); n ) { m_MovieNames.Add(m_pEditor->GetMovies()->GetAt(n)); } } |
我们来看看添加影片的测试,请看代码注释:
void TestOperation::testAdd() { //拷贝一份movie list CStringArray MovieNamesWithAddition; for(int n=0; n<m_MovieNames.GetSize(); n ) { MovieNamesWithAddition.Add(m_MovieNames.GetAt(n)); } MovieNamesWithAddition.Add(LOST_IN_SPACE); //生成窗口 MovieListWindow *pWindow = new MovieListWindow(m_pEditor); pWindow->Init(); //填写新的影片的名称 CEdit* pEdit = pWindow->GetMovieField(); pEdit->SetWindowText(LOST_IN_SPACE); //点击add btn CButton* pBtn = pWindow->GetAddButton(); ::SendMessage(pBtn->m_hWnd, BM_CLICK, 0, 0); //检查列表控件中是否已加入新的影片 CListBox* pListBox = pWindow->GetMovieListBox(); CPPUNIT_ASSERT_EQUAL(MovieNamesWithAddition.GetSize(), pListBox->GetCount()); //检查列表控件中影片名是否正确 CString strNewMovieName; pListBox->GetText(pListBox->GetCount()-1, strNewMovieName); CPPUNIT_ASSERT_EQUAL(LOST_IN_SPACE, strNewMovieName); //销毁窗口 pWindow->DestroyWindow(); delete pWindow; pWindow = NULL; } |
编译后会有出错信息,主要的错误有:
a)、我们把m_pEditor保存在MovieListWindow中了,这需要我们修改原来的MovieListWindow的构造函数。
b)、没有MovieListEditor类。
MovieListEditor的实现如下:
class AFX_EXT_CLASS MovieListEditor { public: MovieListEditor(); virtual ~MovieListEditor(); public: virtual CStringArray* GetMovies(){return &m_arMovieList;}; virtual void Add(CString strMovie){m_arMovieList.Add(strMovie);}; virtual void Delete(int nIndex){m_arMovieList.RemoveAt(nIndex);}; private: CStringArray m_arMovieList; }; |
再次编译,已经通过.运行测试,发现在:
CPPUNIT_ASSERT_EQUAL(MovieNamesWithAddition.GetSize(), pListBox->GetCount()); |
测试通不过。检查后知道原因是,我们在测试代码里:
::SendMessage(pBtn->m_hWnd, BM_CLICK, 0, 0); |
给add button发送了点击按钮的消息,但是在MovieListWindow 窗口中我们没有加入消息的响应函数,因此测试没有通过。赶紧添加消息响应函数。
void MovieListWindow::OnClickAddButton() { UpdateData(); CString strNewMovieName; m_MovieField.GetWindowText(strNewMovieName); if("" != strNewMovieName) { m_pEditor->Add(strNewMovieName); m_MovieListBox.AddString(strNewMovieName); } } |
编译、测试、通过。