2011-09-06 29 views
1

基本上我想設置20個左右的Request.Form值,發送POST到我的控制器,然後檢查結果。編寫將Request.Form數據發送到我的控制器的單元測試最簡單的方法是什麼?

我發現了幾篇文章,如this one,它們描述瞭如何使用NUnit,MVCContrib和Rhino Mocks的組合來完成此操作。但我不知道這是否真的有必要。

似乎Visual Studio 2010和ASP.NET MVC 2應該能夠在本地執行此操作,並在「測試結果」窗口中顯示結果。事實上,當我創建的嚮導創建新的單元測試,談到了這個...

[TestMethod()] 
[HostType("ASP.NET")] 
[AspNetDevelopmentServerHost("G:\\Webs\\MyWebsite.com\\MyWebsite", "/")] 
[UrlToTest("http://localhost:43383/")] 
public void PaypalIPNTest() 
{ 
    BuyController target = new BuyController(); // TODO: Initialize to an appropriate value 
    ActionResult expected = new EmptyResult(); // TODO: Initialize to an appropriate value 
    ActionResult actual; 
    actual = target.PaypalIPN(); 
    Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

是否有可能根據上面的代碼養活target.PaypalIPN()我的Request.Form變量?還是我需要依靠第三方庫來完成這個任務?

回答

3

事實上,當我創建的嚮導創建新的單元測試,談到了這個

是,和所有你可以保持距離,這是方法簽名。方法體是無用的。

因此,讓我們通過觀察此開始:

是否可以養活target.PaypalIPN()我的Request.Form變量

通過閱讀這句話我認爲你的控制器動作看起來是這樣的:

[HttpPost] 
public ActionResult PaypalIPN() 
{ 
    string foo = Request["foo"]; 
    string bar = Request["bar"]; 
    ... do something with foo and bar 
} 

所以第一個是通過引入視圖模型來改善這個代碼:

public class MyViewModel 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 

,然後修改你的方法簽名:

[HttpPost] 
public ActionResult PaypalIPN(MyViewModel model) 
{ 
    ... do something with model.Foo and model.Bar 
} 

現在你的控制器是由任何HttpContext的基礎設施代碼(這確實應該留給框架抽象,它不是你的控制器的行爲負責閱讀請求參數=>這是管道代碼)和單元測試是多麼簡單的事:

[TestMethod()] 
public void PaypalIPNTest() 
{ 
    // arrange 
    var sut = new BuyController(); 
    var model = new MyViewModel 
    { 
     Foo = "some foo", 
     Bar = "some bar", 
    }; 

    // act 
    var actual = sut.PaypalIPN(model); 

    // assert 
    // TODO: 
} 

OK,這是說,在這裏,我們處理了一些非常簡單的控制器動作。對於更高級的場景,你應該考慮使用模擬框架。我個人使用MvcContrib.TestHelper與Rhino Mocks來測試我的ASP.NET MVC應用程序。

+0

謝謝你。我忘了模型可以被MVC引擎自動解釋爲表單集合。這樣做肯定會清理PaypalIPN功能。 –

0

我有另一種方法來測試我的MVC應用程序,首先我使用Dev Magic Fake來僞造控制器下的任何下劃線層,直到應用程序正在運行並且業務被批准爲止,然後使用基於TDD方法替換僞代碼批准要求

CodePlex上

見開發魔術假:

http://devmagicfake.codeplex.com/

感謝

M.Radwan

相關問題