這需要一些指針。發現this和this,但我仍然有點困惑。如何在ASP.NET MVC中測試操作過濾器?
我只是想嘲笑ActionExecutedContext,傳遞它,讓過濾器工作一下,檢查結果。
任何幫助?
過濾器的來源,你可以找到here
(它有點改變,但這不是一個點)。
所以 - 我想單元測試,那個RememberUrl過濾器足夠聰明,可以保存會話中的當前URL。
這需要一些指針。發現this和this,但我仍然有點困惑。如何在ASP.NET MVC中測試操作過濾器?
我只是想嘲笑ActionExecutedContext,傳遞它,讓過濾器工作一下,檢查結果。
任何幫助?
過濾器的來源,你可以找到here
(它有點改變,但這不是一個點)。
所以 - 我想單元測試,那個RememberUrl過濾器足夠聰明,可以保存會話中的當前URL。
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
這是結果:
#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怪物受到了控制! ^^
ActionExecutedContext派生自ControllerContext。 Haacked的答案正是嘲諷ControllerContext - http://stackoverflow.com/questions/32640/mocking-asp-net-mvc-controller-context/32672#32672。你到底在迷惑什麼? – 2009-06-29 11:33:23
只是還沒有做到。我想我缺乏關於asp.net mvc innerwork的知識。 :) – 2009-06-29 11:39:54
然後發佈您的代碼。我們會盡力幫助:) – 2009-06-29 11:41:53