Asp.net mvc 如何在ASP.NETMVC中对自定义ActionFilter进行单元测试
因此,我正在创建一个主要基于此项目的自定义ActionFilter 我想要一个自定义的操作过滤器,它使用HTTPAccept头返回JSON或Xml。典型的控制器操作如下所示:Asp.net mvc 如何在ASP.NETMVC中对自定义ActionFilter进行单元测试,asp.net-mvc,unit-testing,tdd,actionfilterattribute,Asp.net Mvc,Unit Testing,Tdd,Actionfilterattribute,因此,我正在创建一个主要基于此项目的自定义ActionFilter 我想要一个自定义的操作过滤器,它使用HTTPAccept头返回JSON或Xml。典型的控制器操作如下所示: [AcceptVerbs(HttpVerbs.Get)] [AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)] public ActionResult Index() { var articles = Service.GetRecen
[AcceptVerbs(HttpVerbs.Get)]
[AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)]
public ActionResult Index()
{
var articles = Service.GetRecentArticles();
return View(articles);
}
自定义过滤器覆盖OnActionExecuted,并将对象(在本示例文章中)序列化为JSON或Xml
我的问题是:如何测试这一点?
AcceptsTypeFilterJson\u RequestHeaderAcceptsJson\u ReturnsJson()
,AcceptsTypeFilterXml\u RequestHeaderAcceptsXml\u ReturnsXml()
和AcceptsTypeFilter\u acceptsheadermatch\u ReturnsError406()
谢谢 您只需要测试过滤器本身。只需创建一个实例并使用测试数据调用
OnActionExecuted()
方法,然后检查结果。它有助于尽可能地分离代码。大部分重物在可单独测试的CsvResult
类内完成。您不需要在实际控制器上测试过滤器。MVC框架的责任就是让这一切正常工作
public void AcceptsTypeFilterJson_RequestHeaderAcceptsJson_ReturnsJson()
{
var context = new ActionExecutedContext();
context.HttpContext = // mock an http context and set the accept-type. I don't know how to do this, but there are many questions about it.
context.Result = new ViewResult(...); // What your controller would return
var filter = new AcceptTypesAttribute(HttpContentTypes.Json);
filter.OnActionExecuted(context);
Assert.True(context.Result is JsonResult);
}
我只是偶然发现了一个对我来说似乎是正确的方法,他用了
编辑
好的,这家伙正在模拟HTTPContext
,但我们还需要在请求中设置ContentType:
// Mock out the context to run the action filter.
var request = new Mock<HttpRequestBase>();
request.SetupGet(r => r.ContentType).Returns("application/json");
var httpContext = new Mock<HttpContextBase>();
httpContext.SetupGet(c => c.Request).Returns(request.Object);
var routeData = new RouteData(); //
routeData.Values.Add("employeeId", "123");
var actionExecutedContext = new Mock<ActionExecutedContext>();
actionExecutedContext.SetupGet(r => r.RouteData).Returns(routeData);
actionExecutedContext.SetupGet(c => c.HttpContext).Returns(httpContext.Object);
var filter = new EmployeeGroupRestrictedActionFilterAttribute();
filter.OnActionExecuted(actionExecutedContext.Object);
//模拟上下文以运行操作筛选器。
var request=newmock();
SetupGet(r=>r.ContentType).Returns(“application/json”);
var httpContext=new Mock();
SetupGet(c=>c.Request).Returns(Request.Object);
var routeData=新routeData()//
routeData.Values.Add(“employeeId”、“123”);
var actionExecuteContext=new Mock();
actionExecutedContext.SetupGet(r=>r.RouteData).Returns(RouteData);
SetupGet(c=>c.HttpContext).Returns(HttpContext.Object);
var filter=新员工组restrictedActionFilterAttribute();
OnActionExecuted(ActionExecuteContext.Object);
注意-我自己没有测试过它我不知道它是什么时候更改的,但是在.Net Core 3.1
ActionExecutedContext中
没有无参数构造函数,这使得设置更加困难。