在asp.net mvc集成测试中设置IFilterProvider

本文关键字:设置 IFilterProvider 集成测试 mvc asp net | 更新日期: 2023-09-27 18:15:19

我使用这段代码来设置我的mvc应用程序在一个[测试](要重新分解和移动到[setup]等):

// arrange
var mockSomeService = new Mock<ISomeService>();
mockSomeService.Setup(m => m.IsTrue()).Returns(false);   
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterProviders.Providers.Add(new FilterProvider(mockSomeService.Object));
var controller = new HomeController();
// act
var result = controller.Index() as ViewResult;

由于某种原因,在FilterProvider中定义的AuthorizeAttribute从未启动过,但当我手动测试mvc应用程序时,它工作得很好。在这个积分测试中我是不是漏掉了什么?

在asp.net mvc集成测试中设置IFilterProvider

过滤器是作为请求管道的一部分调用的,因此它们不会像您在测试中得到的那样被直接调用操作方法触发。

我不认为您在这里错过了太多,因为请求管道及其对过滤器的调用已经由许多其他人进行了大量测试,因此您可以直接针对过滤器对象编写测试。

我一直在做一个库来帮助测试asp.net-mvc应用程序的所有过滤器,验证器,路由和身份验证。此示例展示了如何添加自定义筛选器提供程序。要使用它,你需要添加一个nuget包Xania.AspNet.Simulator。

using Xania.AspNet.Simulator;
.....
[Test]
public void CustomFilterProviderTest()
{
    // arrange
    var action = new AccountController().Action(c => c.ChangePassword(null));
    action.FilterProviders.Add(new CustomFilterProvider());
    // act
    var result = action.Execute();
    // assert
    Assert.AreEqual("Your Message", result.ViewBag.Message);
    Assert.IsTrue(result.ModelState.IsValid);
    Assert.IsInstanceOf<ViewResult>(result.ActionResult);
    ...
}

更多的例子可以在github找到https://github.com/ibrahimbensalah/Xania.AspNet.Simulator/tree/master/Xania.AspNet.Simulator.Tests