void MovieListWindow::OnClickAddButton()
{
UpdateData();
CString strNewMovieName;
m_MovieField.GetWindowText(strNewMovieName);
if("" != strNewMovieName)
{
m_pEditor->Add(strNewMovieName);
m_MovieListBox.AddString(strNewMovieName);
}
}
。牐牼幾g、測試、通過。
。牐5、Mock Objects
在刪除操作的單元測試中,我們遇到的一個問題是,影片列表的數據應該是保存在一個文本文件或者數據庫當中的,如果我們編寫的測試依賴于這些實際的文件或數據庫,那么我們的測試就會受制于這些外部的資源。一旦文件或者數據庫里的數據發生變化,必然會波及到我們的測試代碼,從而產生錯誤的測試信息。前面的MovieListEditor中我們沒有加入一些初始化的數據,在測試刪除操作時會遇到一些問題 。
這里,我們引入Mock Objects。Mock Objects用來模擬外部復雜的資源(如數據庫,網絡連接等),使UI可以測試那些依賴于這些復雜外界資源的模塊。例如在測試一個跟數據庫有關系的模塊時,我們并不一定要建立一個真實的數據庫連接,而只需建立一個Mock Objects就可以了。測試所需的數據都存在于這個Mock Objects?梢哉f,Mock Objects為我們提供了一個輕量級的、可控制的、高效的模型。
在本例中,影片的增加、刪除都會跟文件或數據庫操作發生關系。這時我們就可以利用Mock Objects來隔離測試代碼與文件或數據庫。使用Mock Objects一般有以下幾個步驟:
。牐燼)、定義一個外部資源的接口.(這個接口一般是可以在重構過程中提煉出來的)。
。牐燽)、定義一個Mock Objects,從外部資源的接口繼承下來,實現外部資源的接口。
。牐燾)、創建一個Mock Objects,并設置它的內部期望值。
[NextPage]
。牐燿)、把創建的這個Mock Objects傳遞給需要測試的模塊進行操作。
。牐爀)、操作完畢后將Mock Objects內部的狀態與期待狀態比較。 現在我們就根據這個步驟來實現本例子中的Mock Objects.通過對前面的代碼進行重構,我們可以提煉出一個接口MovieListEditor:
class AFX_EXT_CLASS MovieListEditor
文章來源于領測軟件測試網 http://www.kjueaiud.com/