});
}
這個試驗是很簡單的。唯一的區別是在設置Context ,我們設定一個期望,從緩存請求特定的頁面時,它將返回samplePage對象。只要其中任何被調用函數中有沒有期望設置,Mock將拋出一個異常。如果代碼試圖調用任何database對象或任何東西上的其他cache對象時,它會拋出一個異常,從而表明它沒有做什么不應該做的。
集成測試使用BDD
集成測試意味著你要測試的一些類,它與其它類和基礎設施集成,如數據庫,文件系統,郵件服務器等,當你寫一個集成測試,測試組件的行為應該是沒有任何實物模型。此外,它們提供額外的信心代碼工作,因為所有必需的組件和依賴關系也被測試。
如何測試業務外觀層,業務外觀處理數據訪問組件和所有其他實用程序組件的編排。它封裝了用戶操作為一體的商業運作。例如,在Dropthings ,當第一次全新的用戶訪問,用戶獲得創建默認的頁面和窗口小部件。這些頁面和小部件來自一個模板。有一個名為anon_user@dropthings.com的用戶擁有默認的頁面和窗口小部件。特定用戶的頁面和窗口小部件被復制到每一個新用戶中。由于這是一個復雜的操作,適合做自動化的集成測試。
當用戶首次訪問該Default.aspx,該FirstVisitHomePage是呼吁Facade。它通過一個復雜的過程來克隆模板頁面、小部件和設置默認用戶設置等集成測試,將確保如果FirstVisitHomePage被調用參數標識一個新的用戶訪問的站點,那么它將返回可以對用戶創建的默認頁面和部件的一個對象。因此: 由于之前從來沒有誰訪問過該網站的匿名用戶, 當用戶第一次訪問, 然后在準確的列和位置作為anon_user的網頁新創建的頁面創建的小部件。
public class TestUserVisit
{
public TestUserVisit()
{
Facade.BootStrap();
}
///
/// Ensure the first visit produces the pages and widgets defined in the template user
///
[Specification]
public void First_visit_should_create_same_pages_and_widgets_as_the_template_user()
{
MembershipHelper.UsingNewAnonUser((profile) =>
{
using (var facade = new Facade(new AppContext(string.Empty, profile.UserName)))
{
UserSetup userVisitModel = null;
// Load the anonymous user pages and widgets
string anonUserName = facade.GetUserSettingTemplate()
.AnonUserSettingTemplate.UserName;
var anonPages = facade.GetPagesOfUser(facade.GetUserGuidFromUserName(anonUserName));
"Given anonymous user who has never visited the site before"
.Context(() => { });
"when the user visits for the first time".Do(() =>
{
userVisitModel = facade.FirstVisitHomePage(profile.UserName,
string.Empty, true, false);
});
"it creates widgets on the newly created page at exact columns and
positions as the anon user's pages".Assert(() =>
{
anonPages.Each(anonPage =>
{
var userPage = userVisitModel.UserPages.First(page =>
page.Title == anonPage.Title
&& page.OrderNo == anonPage.OrderNo
&& page.PageType == anonPage.PageType);
facade.GetColumnsInPage(anonPage.ID).Each(anonColumn =>
{
var userColumns = facade.GetColumnsInPage(userPage.ID);
var userColumn = userColumns.First(column =>
column.ColumnNo == anonColumn.ColumnNo);
var anonColumnWidgets =
facade.GetWidgetInstancesInZoneWithWidget(anonColumn.WidgetZoneId);
var userColumnWidgets =
facade.GetWidgetInstancesInZoneWithWidget(userColumn.WidgetZoneId);
// Ensure the widgets from the anonymous user template's columns are
// in the same column and row.
anonColumnWidgets.Each(anonWidget =>
Assert.True(userColumnWidgets.Where(userWidget =>
userWidget.Title == anonWidget.Title
&& userWidget.Expanded == anonWidget.Expanded
&& userWidget.State == anonWidget.State
&& userWidget.Resized == anonWidget.Resized
&& userWidget.Height == anonWidget.Height
&& userWidget.OrderNo == anonWidget.OrderNo).Count() == 1));
原文轉自:http://www.codeproject.com/Articles/44276/Unit-Testing-and-Integration-Testing-in-Business-A