如何在ASP.NET WEB API中进行单元测试时调用AuthorizationFilterAttribute

时间:2018-01-25 00:03:22

标签: c# unit-testing asp.net-web-api

我正在使用Visual Studio Test项目测试我的asp.net web api控制器。

这是我的测试用例的样子:

overflow: hidden

上面的代码工作正常。

我有一个AuthorizationFilterAttribute。

[TestMethod]
public void TestMethod1()
{
    var controller = new MyController();
    //using json string for providing input
    var input = "{some json object here}"

    var options = JsonConvert.DeserializeObject<Employee>(input);

    var response = controller.GetEmployee(options);

}

每次调用控制器中的任何端点(本例中为public class UserIdFilterAttribute : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext filterContext) { //Logic to inject a userId to Controller ((Controllers.MyController) (filterContext.ControllerContext.Controller)).UserId = userId; } } )时,都会调用此OnAuthorization函数。但是当我使用visual studio测试框架在控制器中调用端点时,不会调用GetEmployee函数。我没有使用任何外部模拟框架。

执行测试用例时,我需要做什么才能自动调用OnAuthorization

2 个答案:

答案 0 :(得分:1)

属性过滤器由Web API管道调用,该管道在单元测试期间不活动。您可能需要进行端到端内存集成测试,以使框架调用操作过滤器。

其他明智的做法是直接在控制器上设置它,同时测试它是否是可公开获得的成员

[TestMethod]
public void TestMethod1() {
    var controller = new MyController() {
        //Inject a userId to Controller
        UserId = userId
    };
    //using json string for providing input
    var input = "{some json object here}";

    var options = JsonConvert.DeserializeObject<Employee>(input);

    var response = controller.GetEmployee(options);

}

答案 1 :(得分:0)

您的控制器的测试应仅检查过滤器属性的状态,而不是过滤器属性的行为。 (也就是说,完全依赖WebAPI保证它会运行你在控制器上放置的所有过滤器。)

测试是否存在过滤器:

[TestFixture]
public class MyControllerTests
{
    [Test]
    public MyController_Has_UserIdFilterAttribute()
    {
        var attribute = typeof(MyController)
                        .GetCustomAttributes(typeof(UserIdFilterAttribute))
                        .SingleOrDefault();
        Assert.That(attribute, Is.Not.Null);
    }
}

然后,如果你愿意的话,单独编写一个过滤器本身的测试。