我正在使用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
?
答案 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);
}
}
然后,如果你愿意的话,单独编写一个过滤器本身的测试。