2011-11-03 119 views
2

我從來沒有測試過ASP.NET MVC3應用程序,雖然我有很多NUnit/JUnit/etc的經驗。和TDD。我的問題是,我可以使用什麼樣的策略來測試MVC應用程序?集成測試ASP.NET MVC應用程序

編輯:我在這裏的重點是主要圍繞測試策略,而且,重點是集成測試 - 測試什麼,當他們通過點擊我的應用程序真正的用戶會去。

我的設置是帶有ORM的ASP.NET MVC(NHibernate或Dapper,取決於項目)。

是否有一個類似於NUnit的基於網絡的測試套件?我應該寫一個嗎?或者我應該(以某種方式)試圖將我的應用程序分解成一百萬個非萬維網DLL並在NUnit中測試它們? (是,即使ActiveRecord的/ NHibernate的可能的,因爲ORM層?)

你是做什麼來測試這種應用程序的?

我看了類似的SO問題,除了「這裏是如何測試控制器」之外,沒有找到太多的東西。

+0

mvc從最初開始便於測試,它允許您獨立測試控制器方法,視圖和模型,您正在尋找哪種類似於NUnit的套件?爲什麼不使用NUnit?你也可以使用R#並且它允許你輕鬆地運行NUnit測試 – vittore

回答

3

有各種不同的測試:單元,集成,驗收,...

如果你正在談論的單元測試,ASP.NET MVC的設計考慮了可測試性。有很多說明這些概念的文章。這裏是one example。和another one。然而another one。如果你希望你的應用程序是單元可測試的,你將不得不設計它,以便在不同層之間有一個弱耦合。因此,舉個例子,你將抽象所有數據訪問在控制器將要使用的接口後面。你將使用一個DI框架,它將一個具體的實現(NHibernate或其他)傳遞給控制器​​,並且在單元測試中你將能夠使用一個模擬框架來存根數據訪問層並且完全隔離地測試這個控制器。

+0

+1這看起來就像我正在尋找的東西。 Rails有這個工具,你可以說:「去這個URL,點擊這個鏈接,檢查HTML包含'blah blah blah'。」這在MVC3中有可能嗎? (我沒有仔細查看你的鏈接) – ashes999

+1

@ ashes999,如果你有Visual Studio的測試版或者終極版,你可以使用內置的[Web and Load Tests](http://blogs.msdn。 COM/b/amit_chatterjee /存檔/ 2009/01 /第29 /網絡和負載測試與 - 視覺工作室團隊system.aspx)。如果沒有,你可以看看[WatiN](http://watin.org/)。 –

0

如果您已經熟悉Nunit/Junit和TDD,那麼這些策略只需要應用於單元測試MVC Web應用程序。

有沒有必要寫一個基於Web的測試套件,也不是他們需要打破你的應用程序出到「萬」小非Web dll的。這就是說,你仍然需要設計你的應用程序是可測試的。

一個非常簡單的控制器測試可能如下所示。請注意,我的示例是使用Moq作爲存儲庫/ DI。

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
} 

如果你想單元測試/ MVC的一些例子,通過書呆子晚餐示例應用程序瀏覽:http://nerddinner.codeplex.com/

+0

這個答案解決了單元測試問題。我的意思是更多的集成測試(例如,登錄,瀏覽到X頁面,點擊Y,...) – ashes999

+0

@ ashes999,我已經成功地使用了Watin提供的測試類型:http:// watin。 org/ – Jesse

+0

是的,那也是Darin的建議。 – ashes999

0

我認爲這depende你要測試的。如果你想從用戶界面進行測試,你需要爲用戶界面使用某種驅動程序,如SeleniumWatin

如果你也有這些捲筒紙驅動器,你在紅寶石例如你可以寫規範的一個使用Specflow在一起。

我自己不會去測試通過用戶界面,因爲我認爲用戶界面變化很大。我會將注意力集中在MVC應用程序中的控制器上,並將控制器保持在非常小的狀態,並在其中添加最少量的邏輯。我認爲控制器應該只提供一些基本的輸入驗證,而不是委託給你的應用程序。

所有這一切還取決於你的應用程序有多複雜,主要的經驗法則應該是保持簡單:)。

1

當我們談論的ASP.NET MVC應用程序的集成測試有兩點考慮:

  1. 測試套件應該與應用程序交互的用戶使用你的Web瀏覽器
  2. 測試套件應該能夠在測試會話期間隔離(模擬)Web應用程序的不同部分。

如果這是你的話,那麼這是我的recipie:

  1. 主機使用命令行

    iisexpress.exe /path:[path] /port:[port] 
    
  2. 使用Selenium web driver效仿瀏覽器活動使用IIS Express的Web應用程序。

  3. 使用SpecFlowgherkin語言
  4. 使用Deleporter 來模擬Web應用程序組件定義它運行

我已經寫了詳細的article對這種做法,而用戶會話。 還有一個github repo與此方法實施。

相關問題