.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;
}