.net 如何测试ActionFilter?
我有一个名为.net 如何测试ActionFilter?,.net,asp.net-mvc,asp.net-mvc-4,unit-testing,testing,.net,Asp.net Mvc,Asp.net Mvc 4,Unit Testing,Testing,我有一个名为TimeoutFilter的操作过滤器,我将其应用于我的“BaseController”: [TimeoutFilter] public abstract class BaseController: Controller { } 在哪里 测试配置部分很容易,但是如何测试超时部分呢?我的直觉告诉我声明TestController:BaseController,然后在该控制器上的一个操作方法中,以某种方式检查HttpContext.Current.Server.ScriptTimeou
TimeoutFilter
的操作过滤器,我将其应用于我的“BaseController”:
[TimeoutFilter]
public abstract class BaseController: Controller
{
}
在哪里
测试配置部分很容易,但是如何测试超时部分呢?我的直觉告诉我声明
TestController:BaseController
,然后在该控制器上的一个操作方法中,以某种方式检查HttpContext.Current.Server.ScriptTimeout
值是否等于配置值。我认为没有必要测试服务器是否确实超时。但是您可以测试HttpContext.Current.Server.ScriptTimeout
是否设置为与配置中相同的值
[TestMethod]
public void OnActionExecuting_SetTimeout_TimeoutIsTheSameAsConfig()
{
var request = new HttpRequestMessage();
var actionContext = InitializeActionContext(request);
var filter = new TimeoutFilter();
filter.OnActionExecuting(actionContext);
Assert.AReEqual(HttpContext.Current.Server.ScriptTimeout, ConfigurationManager.AppSettings["MvcActionTimeoutSeconds"]);
}
// Code excerpt from http://chimera.labs.oreilly.com/books/1234000001708/ch17.html#_unit_testing_an_actionfilterattribute
private HttpActionContext InitializeActionContext(HttpRequestMessage request)
{
var configuration = new HttpConfiguration();
var routeData = new HttpRouteData(route,
new HttpRouteValueDictionary
{
{ "controller", "Issues" }
}
);
request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
var controllerContext = new HttpControllerContext(configuration, routeData, request);
var actionContext = new HttpActionContext
{
ControllerContext = controllerContext
};
return actionContext;
}
很有趣的想法,谢谢,但是你的代码无法编译。我修复了
InitializeActionContext
中缺少的route
实例,即使如此,我仍然收到错误“无法从'System.Web.Http.Controllers.HttpActionContext'转换为'System.Web.Mvc.actionExecutionContext'”。我现在无法判断。您的代码可以在我的家用机器上正常构建,但不能在我的工作机器上构建,因为我的工作机器是全新的。它可能需要一些更新+谢谢你的帮助,但是我用Rhino Mocks很好地解决了这个问题。我会尽快将其从repo中提取出来。这可能是因为[TestMethod]
操作执行的属性\u SetTimeout\u TimeoutIsTheSameAsConfig。我使用的是MSTest,但您可以将其更改为您正在使用的任何单元测试。
[TestMethod]
public void OnActionExecuting_SetTimeout_TimeoutIsTheSameAsConfig()
{
var request = new HttpRequestMessage();
var actionContext = InitializeActionContext(request);
var filter = new TimeoutFilter();
filter.OnActionExecuting(actionContext);
Assert.AReEqual(HttpContext.Current.Server.ScriptTimeout, ConfigurationManager.AppSettings["MvcActionTimeoutSeconds"]);
}
// Code excerpt from http://chimera.labs.oreilly.com/books/1234000001708/ch17.html#_unit_testing_an_actionfilterattribute
private HttpActionContext InitializeActionContext(HttpRequestMessage request)
{
var configuration = new HttpConfiguration();
var routeData = new HttpRouteData(route,
new HttpRouteValueDictionary
{
{ "controller", "Issues" }
}
);
request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
var controllerContext = new HttpControllerContext(configuration, routeData, request);
var actionContext = new HttpActionContext
{
ControllerContext = controllerContext
};
return actionContext;
}