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

C# 如何在ASP.NET WEB API中进行单元测试时调用AuthorizationFilterAttribute,c#,unit-testing,asp.net-web-api,C#,Unit Testing,Asp.net Web Api,我正在使用Visual Studio测试项目测试我的asp.net web api控制器 以下是我的测试用例的外观: [TestMethod] public void TestMethod1() { var controller = new MyController(); //using json string for providing input var input = "{some json object here}" var options = Json

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

以下是我的测试用例的外观:

[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);

}
每次调用控制器中的任何端点(
GetEmployee
)时,都会调用此
OnAuthorization
函数。但当我使用VisualStudio测试框架在控制器中调用endpoint时,
OnAuthorization
函数不会被调用。我没有使用任何外部模拟框架


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

属性过滤器由在单元测试期间不活动的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);

}
[TestMethod]
公共void TestMethod1(){
var controller=new MyController(){
//将用户ID注入控制器
UserId=UserId
};
//使用json字符串提供输入
var input=“{some json object here}”;
var options=JsonConvert.DeserializeObject(输入);
var response=controller.GetEmployee(选项);
}

对控制器的测试应该只检查过滤器属性的存在,而不是过滤器属性的行为。(也就是说,完全依赖WebAPI的保证,它将运行您在控制器上设置的所有过滤器。)

要测试过滤器是否存在,请执行以下操作:

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

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

如果您是单元测试控制器,则不必担心控制器之外的任何其他代码的执行。如果在授权属性中对ControllerContext所做的更改在控制器代码中使用,那么您应该模拟或伪造ControllerContext并将其分配给控制器并设置其行为。这实际上解决了我的问题。我不知道为什么我没有想到这个简单的解决方案。请投赞成票。但是,当通过testcase调用控制器中的任何端点时,实际问题仍然悬而未决,如何调用AuthorizationFilterAttribute。如何进行端到端测试?@OpenStack它只会在集成测试中调用。属性过滤器是可以单独测试的交叉关注点。在这些情况下,在练习testI second@Nkosi时,您必须模拟
HttpActionContext
,如果您想进行单元测试,您不应该依赖过滤器。否则它将成为一个集成测试。但从您的评论中,您说我如何进行端到端测试,这表明您正在进行某种集成测试。在这种情况下,您可能希望依靠我们已经建立的
[TestFixture]
public class MyControllerTests
{
    [Test]
    public MyController_Has_UserIdFilterAttribute()
    {
        var attribute = typeof(MyController)
                        .GetCustomAttributes(typeof(UserIdFilterAttribute))
                        .SingleOrDefault();
        Assert.That(attribute, Is.Not.Null);
    }
}