如何使用ASP.NET Web API测试ActionFilterAttribute?

如何使用ASP.NET Web API测试ActionFilterAttribute?,asp.net,unit-testing,asp.net-web-api,asp.net-web-api2,Asp.net,Unit Testing,Asp.net Web Api,Asp.net Web Api2,我正在构建一个ASP.NET Web API,它使用一个非常简单的操作过滤器: public class ValidateModelAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { v

我正在构建一个ASP.NET Web API,它使用一个非常简单的操作过滤器:

public class ValidateModelAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(HttpActionContext actionContext) {
        if (actionContext.ModelState.IsValid == false) {
            var responseObject = new ApiResponse() {
                Errors = actionContext.ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)
            };

            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, responseObject);
        }
    }
}
我的操作过滤器只是强制执行
ModelState
是有效的;如果不是,它将返回一个包含所有错误消息的400,以便客户端可以对数据执行任何操作

以下是我在控制器中使用属性的方式:

[ValidateModelAttribute]
public HttpResponseMessage Db(DbModel model) {
    return Request.CreateResponse(HttpStatusCode.OK);
}
我正在尝试使用Visual Studio的测试框架测试该属性:

[TestMethod]
public void CaptureApiDatabase_IfRequiredFieldMissing_ReturnHttpBadRequest() {
    var controller = new ConfigureController();
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();            

    var validationAttribute = new ValidateModelAttribute();
    validationAttribute.OnActionExecuting(controller.ActionContext);
    Assert.IsTrue(controller.ActionContext.Response.StatusCode == HttpStatusCode.BadRequest);
}

这不起作用,因为我没有提供筛选我的数据,因此
ModelState
始终有效。如何构建上下文以便测试此筛选器属性?

这应该会帮助您:@Fals-我已经看到了这个问题,但答案只是Microsoft源代码的复制和粘贴,没有演示如何实际测试该属性。这很复杂,您应该隔离该属性进行测试。模拟整个请求管道将很困难。您找到解决方案了吗?