Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在ASP.NETMVC中对自定义ActionFilter进行单元测试_Asp.net Mvc_Unit Testing_Tdd_Actionfilterattribute - Fatal编程技术网

Asp.net mvc 如何在ASP.NETMVC中对自定义ActionFilter进行单元测试

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

因此,我正在创建一个主要基于此项目的自定义ActionFilter

我想要一个自定义的操作过滤器,它使用HTTPAccept头返回JSON或Xml。典型的控制器操作如下所示:

[AcceptVerbs(HttpVerbs.Get)]
[AcceptTypesAttribute(HttpContentTypes.Json, HttpContentTypes.Xml)]
public ActionResult Index()
{
    var articles = Service.GetRecentArticles();

    return View(articles);
}
自定义过滤器覆盖OnActionExecuted,并将对象(在本示例文章中)序列化为JSON或Xml

我的问题是:如何测试这一点?

  • 我写什么测试?我是一个TDD新手,不能100%确定我应该测试什么,不应该测试什么。我提出了
    AcceptsTypeFilterJson\u RequestHeaderAcceptsJson\u ReturnsJson()
    AcceptsTypeFilterXml\u RequestHeaderAcceptsXml\u ReturnsXml()
    AcceptsTypeFilter\u acceptsheadermatch\u ReturnsError406()
  • 如何在MVC中测试测试Http接受头的ActionFilter

  • 谢谢

    您只需要测试过滤器本身。只需创建一个实例并使用测试数据调用
    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中
    没有无参数构造函数,这使得设置更加困难。