2010-10-08 26 views
2

所以我試圖單元測試一個控制器方法。我在VS 2010中使用MSTest的,起訂量和3.1當測試Asp.net MVC應用程序時,Microsoft.Web.Mvc.LinkBuilder.BuildUrlFromExpression失敗

測試方法:

[TestMethod] 
    public void TestAccountSignup() 
    { 
     var request = new Mock<HttpRequestBase>(); 
     var context = new Mock<HttpContextBase>(); 

     AccountController controller = new AccountController(); 
     controller.ControllerContext = new System.Web.Mvc.ControllerContext(context.Object, new RouteData(), controller); 

     request.Setup(x => x.Cookies).Returns(new HttpCookieCollection()); 

     context.Setup(x => x.Request).Returns(request.Object); 

     string username = StringHelper.GenerateRandomAlpha(10); 

     var res = controller.Register(username, "foozbaaa+" + username + "@example.com", null, true, "Testing!", null); 
    } 

我控制器的方法:

[CaptchaValidator] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Register(string userName, string email,string existingUsername, bool captchaValid, string heardAbout, string heardAboutOther) 
    { 
     //Loads of stuff here.... 

     //cool - all registered 
     //This line gives the problem 
    return new RedirectResult(this.BuildUrlFromExpression<AccountController>(x => x.AccountCreated())); 
    } 

控制器方法工作得很好,當沒有單元測試。

當嘲諷,並呼籲通過這種方式,我得到的是最後一行System.Security.VerificationException:

方法Microsoft.Web.Mvc.LinkBuilder.BuildUrlFromExpression:類型參數「TController」違反了類型的約束參數'TController'。

現在很明顯AccountController是TController類型,否則當不進行單元測試時它將不起作用。它從我的BaseController繼承,它從常規Controller繼承。

我覺得這個錯誤是一個紅鯡魚,由於嘲笑 - 任何想法爲什麼?

非常感謝。

回答

2

這是因爲Futures使用略有不同的控制器類型。

我不確定具體情況,但我遇到了同樣的問題。它可能是期貨控制器與MVC 2控制器或MVC 1控制器與MVC 2控制器。

看看是否完全符合類型名稱的幫助。

+0

它最終就是這樣 - 我在我的測試項目中引用了期貨v1 dll,但在實際應用中有v2。非常感謝。 – Nik 2010-10-09 16:23:39

1

如何執行以下操作:

[HttpPost] 
public ActionResult Register() 
{ 
    return this.RedirectToAction<AccountController>(x => x.AccountCreated()); 
} 

RedirectToAction<T>是一個擴展方法在Microsoft.Web.Mvc.ControllerExtensions(ASP.NET MVC期貨的一部分)限定的Controller類。

現在單元測試更容易了。你甚至都不需要模擬情境:

// arrange 
var controller = new AccountController(); 

// act 
var actual = controller.Register(); 

如果你使用優秀MvcContrib.TestHelper我強烈建議你,你的單元測試的斷言部分看起來是這樣的:

// assert 
actual 
    .AssertActionRedirect() 
    .ToAction<AccountController>(x => x.AccountCreated()); 
+0

非常感謝Contrib測試人員和擴展方法的堆棧 - 非常好。 – Nik 2010-10-09 16:24:28

相關問題