2009-06-29 102 views
14

這需要一些指針。發現thisthis,但我仍然有點困惑。如何在ASP.NET MVC中測試操作過濾器?

我只是想嘲笑ActionExecutedContext,傳遞它,讓過濾器工作一下,檢查結果。

任何幫助?

過濾器的來源,你可以找到here
(它有點改變,但這不是一個點)。

所以 - 我想單元測試,那個RememberUrl過濾器足夠聰明,可以保存會話中的當前URL。

+0

ActionExecutedContext派生自ControllerContext。 Haacked的答案正是嘲諷ControllerContext - http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context/32672#32672。你到底在迷惑什麼? – 2009-06-29 11:33:23

+0

只是還沒有做到。我想我缺乏關於asp.net mvc innerwork的知識。 :) – 2009-06-29 11:39:54

+0

然後發佈您的代碼。我們會盡力幫助:) – 2009-06-29 11:41:53

回答

11

1)嘲諷Request.Url在ActionExecutedContext:

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(r => r.HttpMethod).Returns("GET"); 
request.SetupGet(r => r.Url).Returns(new Uri("http://somesite/action")); 

var httpContext = new Mock<HttpContextBase>(); 
httpContext.SetupGet(c => c.Request).Returns(request.Object); 

var actionExecutedContext = new Mock<ActionExecutedContext>(); 
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object); 

2)假設你在你的RememberUrlAttribute的公共構造注入會話包裝。

var rememberUrl = new RememberUrlAttribute(yourSessionWrapper); 

rememberUrl.OnActionExecuted(actionExecutedContext.Object); 

// Then check what is in your SessionWrapper 
3

這是結果:

#region usages 

using System; 
using System.Collections.Specialized; 
using System.Web; 
using System.Web.Mvc; 
using x.TestBase; 
using x.UI.y.Infrastructure.Enums; 
using x.UI.y.Infrastructure.Filters; 
using x.UI.y.Test.Mocks; 
using Moq; 

//considering switch to NUnit... :D 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

#endregion 

namespace x.UI.y.Test.Unit.Infrastructure.Filters 
{ 
    [TestClass] 
    public class RememberUrlTester : TesterBase 
    { 
     private static HttpContextBaseMock _context = 
      new HttpContextBaseMock(); 
     private static ActionExecutedContextMock _actionContext = 
      new ActionExecutedContextMock(_context.Object); 

     [TestMethod] 
     //"Can save url in session" (i prefer test names in my own language :) 
     public void SpeejPieglabaatUrlSesijaa() 
     { 
      //Arrange 
      const string _url = "http://www.foo.bar/foo?bar=bar"; 
      _context.RequestMock.SetUrl(_url);  
      var filter = new RememberUrlAttribute(); 

      //Act 
      filter.OnActionExecuted(_actionContext.Object); 

      //Assert 
      _context.SessionMock.Verify 
       (m => m.Add(SessionKey.PreviousUrl.ToString(), _url)); 
     } 
    } 
} 

素裹<HttpWhatever>保持測試乾淨。

我相信事情可以做的更好,但我認爲這是一個很好的開始,我感到非常興奮。

最後那個HttpContext怪物受到了控制! ^^

相關問題