2011-04-03 77 views
2

我是單元測試和MVC開發新手。
我有一個在asp.net mvc中使用moq進行單元測試的問題。我有它接受一個Ajax動作的控制器:與HTTP請求這是我從視圖生成簡單的問題:在asp.net中設置模擬ajax請求mvc

 
[HttpPost,Authorize] 
     public ActionResult GrabLink() 
     { 
      string username = HttpContext.User.Identity.Name; 
      string rssUrl = Request.Params["Grablink"].ToString(); 
...} 

此操作涉及:

但我不能找到一種方法來定義參數予在課堂上使用。另外,有沒有辦法直接使用值綁定提供程序將值傳遞給控制器​​,如果我想做一個Ajax的帖子?

我是處理web請求的新手。如果你有一些很好的教程來更好地理解Http請求(以及HttpContext和asp.net中的相關類),請在這裏發帖。非常感謝你!

回答

1

由於Scott表示HttpContext使控制器很難測試。無論如何,他在here有一個漂亮的解決方案。

順便說一句,如果通過POST或GET指定參數,爲什麼不給rssUrl一個參數?

例如

//POST: /GrabLink?rssUrl=bla bla... 

[HttpPost,Authorize] 
public ActionResult GrabLink(IPrincipal user, string rssUrl) { 
    string userName = user.Name; 
} 
+0

非常感謝。你的解決方案看起來非常整齊。我會在稍後嘗試。 – Seen 2011-04-04 03:42:16

+0

不客氣。請讓我知道如果它不起作用。 – cem 2011-04-04 04:46:24

1

好的,@cem很好地涵蓋了你的第二個問題。

爲了您的第一,nerddinner,並且如果我沒有記錯的話,當你創建單元測試一個新的互聯網應用,在Visual Studio中,有HttpContext以下mock類。它在this file的底部。

你可以使用這些(或創建一個新的互聯網應用程序+ VS測試),並複製所有假類爲您的測試。 (我寫了下面一個起訂量例子)

它看起來像這樣:

public class MockHttpContext : HttpContextBase { 
    private IPrincipal _user; 

    public override IPrincipal User { 
     get { 
      if (_user == null) { 
       _user = new MockPrincipal(); 
      } 
      return _user; 
     } 
     set { 
      _user = value; 
     } 
    } 

    public override HttpResponseBase Response 
    { 
     get 
     { 
      return new MockHttpResponse(); 
     } 
    } 
} 

public class MockHttpResponse : HttpResponseBase { 
    public override HttpCookieCollection Cookies 
    { 
     get 
     { 
      return new HttpCookieCollection(); 
     } 
    } 
} 

沒有測試,但使用嘲笑它應該是這樣的:

var fakeReqBase = new Mock<HttpRequestBase>(); 
fakeReqBase.Setup(f => f.User).Returns(new GenericIdentity("FakeUser")); 
//generic identity implements IIdentity 
fakeUserRepo.Object;//this returns fake object of type HttpRequestBase 

結帳的Moq Quickstart 。它很容易習慣,流暢的界面真的有幫助。

+0

感謝您的參考。我會在稍後處理它。 – Seen 2011-04-04 17:12:41

2

這工作對我非常好:

var controller = new HomeController(); 

var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
var controllerContext = new Mock<ControllerContext>(); 

controllerContext.SetupGet(x => x.HttpContext.User.Identity.Name) 
    .Returns("TestUser"); 
controllerContext.SetupGet(x => x.HttpContext.User.Identity.IsAuthenticated) 
    .Returns(true); 
controllerContext.SetupGet(x => x.HttpContext.Request.IsAuthenticated) 
    .Returns(true); 
controller.ControllerContext = controllerContext.Object; 

// As a bonus, instantiate the Url helper to allow creating links 
controller.Url = new UrlHelper(
    new RequestContext(context.Object, new RouteData()), new RouteCollection()); 

這將允許您初始化要作爲身份驗證的用戶的任何用戶,並且最後一行將允許您的用戶控制器內的Url幫手,即使你從單元測試中調用它。

+0

這種方法看起來非常整齊...我學到了很多東西。謝謝! – Seen 2011-04-04 15:28:19

+0

@Seen - 不客氣,樂於幫助 :) – 2011-04-04 15:37:44