2011-07-12 65 views
6

如何對一個.net mvc控制器/操作進行功能測試。.net MVC功能測試

我剛剛從Rails開發的多年開發到一個演出,我在黑客攻擊.net mvc。它傷害了,但我希望這其中很大一部分只是學習曲線。

對於我來說,並不是顯而易見的事情是.NET世界中Rails功能和集成測試的模擬。 Rails讓功能測試變得如此明顯和簡單,以至於你不會花時間來獲得覆蓋。用.NET - 我還沒有讓Google產生一個似乎值得的結果。我希望這是我新生的.net狀態,這使我無法進入正確的搜索條件或缺少一些範例。

幫助!

+0

控制器操作只是一種方法,可以進行測試(使用僞造/模擬進行隔離)。功能測試還有什麼比每個條件的Arrange,Act,Assert模式更具體,並且提供了具體的類實例來防止隔離和測試整個應用程序? – StuperUser

+2

部分原因可能是術語。在Rails世界中,我們討論功能測試,但我們真的是指我們的控制器的單元測試。從我見過的大多數Rails程序員將真正的單元測試(僅用於測試代碼)和功能測試(包括數據庫等外部依賴)混合在一起。 .NET社區似乎更緊密地遵循這些。 Roy Osherove在.NET中測試了一本體面的書http://artofunittesting.com/ –

回答

0

如果你真的想測試功能,而不是標準的「單元」測試,你有幾個選擇。

  1. 獲得創意並使用MS測試來設置更多基於功能的測試。
  2. 使用框架的BDD類型(specFlow?)
  3. 使用功能更強大的測試框架,像硒

如果你的目標是朝着更加自動化的UAT的功能測試,你也有類似的FIT項目框架(和Fitnesse)。

這些是Rails中工具和框架的直接類比嗎?不,但.NET不是Rails。

+0

對 - 明白它是蘋果和橘子。真正的問題應該是:「什麼是功能測試mvc控制器/操作的正確方法」。不知道是否有規定的模式,或者是否是開放式的。我想我正在尋找.NET noob功能測試初學者指南。 – Cory

+0

@Cory,請參閱我對原始帖子關於「單元測試」和「功能測試」術語的評論。我也推薦了一本書:) –

+0

@Wizard - 同意區分。感謝指針。 – Cory

3

請原諒我缺乏Rails知識,並告訴你你已經瞭解的有關rails的信息,但我希望爲其他用戶提供比較格式的信息。

Rails有三種類型的測試單元,功能和集成。

單元測試測試模型

功能測試你的控制器

集成測試用於測試控制器操作

這種模式似乎是從軌道開始教之間的流動。

但是,在.NET MVC的世界裏,測試的方法並不像他們在Rails中那樣佈置。

許多開發人員將在您的控制器上編寫單元測試,其方式是在您的模型中使用單元測試編寫單元測試。你基本上調用一個方法(Controller Action)並從方法中獲取一個對象。然後你可以斷言它有你期望的值。這樣做是一個痛苦的屁股,因爲你必須嘲笑這麼多廢話(HttpContext等)。另外,這不是一個功能測試。您只測試一種方法,而不是測試應用程序的功能。

在Rails中,您不是在控制器上編寫單元測試,而是實際發出Web請求並獲得Web響應。您可以檢查狀態代碼,Cookie等。您正在對系統進行端到端測試。

有幾種方法可以做到這一點。NET MVC

1)史蒂文桑德森有一個小工具來幫助這一點。

http://blog.stevensanderson.com/2009/06/11/integration-testing-your-aspnet-mvc-application/

當我第一次看到這一點,並使用它,我認爲這是真棒開始,但我遇到了問題。

2)RestSharp + NUnit - 這是我目前的偏好做這些測試。它可以讓你把一個Web請求放在一起,並得到一個非常容易的響應。通過一些通用方法,您可以使用restsharp快速移動。 NUnit會給你你需要的斷言。我只是對本地IIS服務器發出請求,並在響應中聲明我期望的不同項目。你不能真正能夠測試哪種模型被分配到視圖,就像你可以在rails中那樣,但這對我來說不是問題。

如果你習慣了RSpec,那麼你可以得到類似的SpecFlow。

Rails在框架中構建測試權,它是一流的公民。它太糟糕了,它不是這樣在.NET MVC中。

希望有所幫助。

0

單元測試MVC應用程序的最佳方式是在解決方案中添加一個新的單元測試項目。只需右鍵點擊項目解決方案,點擊添加,然後添加 - >測試項目。

您將看到一個測試類,它將在其上有[TestMethod]屬性的方法。你將用這些方法編寫你的單元測試邏輯。

在測試項目中添加要進行單元測試的MVC項目的新引用.dll。這將使測試項目能夠發現主項目的實際控制器行爲。

添加對System.Web.MVC命名空間的引用。

請參考下面的測試方法的樣本:

[TestMethod] 
public void DisplayCustomer() 
{ 
    CustomerController obj = new CustomerController(); 
    var testResult = obj.DisplayCustomer(); 
    Assert.AreEqual("DisplayCustomer",testResult.ViewName); 
} 

生成並運行該項目以查看合格/在測試失敗的測試結果窗口

希望這有助於!

謝謝。