我正在构建一个使用非常简单的动作过滤器的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
始终有效。如何构建上下文以便我可以测试此过滤器属性?