現在添加真正的代碼:
public Page Insert(Action populate)
{
var newPage = _database.Insert(
DropthingsDataContext.SubsystemEnum.Page, populate);
RemoveUserPagesCollection(newPage.UserId);
return newPage.Detach();
}
現在,當單元測試是對的PageRepository ,它通過新的測試,與以往的測試一起:
使用BDD進行集成測試測試驅動開發
如果我們想為集成測試做TDD?我們如何先寫測試代碼,然后寫它與其他組件集成業務層的代碼? 我們如何為Web層做TDD?方法是一樣的,首先你編寫測試代碼,給出正確的輸入,并期望從中活得輸出,然而,集成測試不應該只調用單獨一個業務操作,以確保它能正常工作。集成測試還應該確保執行其它操作時出現正確的行為。例如,在測試FirstVisitHomePage 時,期望的是,第一次訪問之后,用戶具有創建的正確頁面。測試代碼通過檢查返回的對象模型驗證這一點,但實際情況是,在第一次訪問后,根據用戶的返回,他們應該看到相同的部件,再次確認第一和復診返回相同的數據。
測試如下:
public void Revisit_should_load_the_pages_and_widgets_exactly_the_same()
{
MembershipHelper.UsingNewAnonUser((profile) =>
{
using (var facade = new Facade(new AppContext(string.Empty, profile.UserName)))
{
UserSetup userVisitModel = null;
UserSetup userRevisitModel = null;
"Given an anonymous user who visited first".Context(() =>
{
userVisitModel = facade.FirstVisitHomePage(profile.UserName, ...);
});
"when the same user visits again".Do(() =>
{
userRevisitModel = facade.RepeatVisitHomePage(profile.UserName, ...);
});
"it should load the exact same pages, column and
widgets as the first visit produced".Assert(() =>
{
userVisitModel.UserPages.Each(firstVisitPage =>
{
Assert.True(userRevisitModel.UserPages.Exists(page =>
page.ID == firstVisitPage.ID));
var revisitPage = userRevisitModel.UserPages.First(page =>
page.ID == firstVisitPage.ID);
var revisitPageColumns = facade.GetColumnsInPage(revisitPage.ID);
facade.GetColumnsInPage(firstVisitPage.ID).Each(firstVisitColumn =>
{
var revisitColumn = revisitPageColumns.First(column =>
column.ID == firstVisitColumn.ID);
var firstVisitWidgets = facade
.GetWidgetInstancesInZoneWithWidget(firstVisitColumn.WidgetZoneId);
var revisitWidgets = facade
.GetWidgetInstancesInZoneWithWidget(revisitColumn.WidgetZoneId);
firstVisitWidgets.Each(firstVisitWidget =>
Assert.True(revisitWidgets.Where(revisitWidget =>
revisitWidget.Id == firstVisitWidget.Id).Count() == 1));
});
});
});
}
});
}
做集成測試的正確方法是編寫單元測試的對立面。在單元測試中,這種方法是通過調用一種方法和存根。在集成測試,你應該測試不僅只有一個操作,而且還執行其它相關操作,以確保測試的操作確實是它應該做的。概括了可能的測試用例分為以下類別:
當測試創建新數據操作(例如,在數據庫中插入行或調用Web服務來創建一個實體),保證了操作通過適當進行:
調用,通過再次讀取該行或調用另一個Web服務,以獲得創建的實體讀取數據等操作。如果數據沒有被正確插入(例如,插入子行)應該失敗。 這是一個積極的測試。
調用如果插入成功,例如再次插入同一行會產生一個違反約束,將失敗的其它操作。這是一種消極的考驗。
當測試的操作的更新數據(例如,更新數據庫中的行),保證了操作的數據,通過適當更新
調用使用更新后的數據,如果沒有正確的更新數據會失敗,例如其它的操作使余額不足的賬戶兩次連續的匯款后。這是一個積極的測試。
如果調用更新成功,將是失敗的其它操作,例如嘗試使用更新后的相同值約束沖突在數據庫中插入新行。這是一種消極的考驗。
原文轉自:http://www.codeproject.com/Articles/44276/Unit-Testing-and-Integration-Testing-in-Business-A