C# 如何在ASP.NET WEB API中进行单元测试时调用AuthorizationFilterAttribute
我正在使用Visual Studio测试项目测试我的asp.net web api控制器 以下是我的测试用例的外观: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
[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);
}
}