我正在尝试研究如何编写一个测试控制器授权工作的单元测试。 IE未登录的用户无法访问该页面。有人知道怎么做吗?我无法找到例子。
像这样的东西(伪代码) [TestMethod]
public void Get_Auth_Page()
{
be_a_user_thats_not_logged_in = true;
// Arrange
MyController controller = new MyController();
// Act
var result = controller.Index();
// Assert
if(result.httpstatus == 403)
Assert.True();
}
答案 0 :(得分:1)
如果您只是使用[Authorize]
来装饰您的操作方法,那么您可以进行一个断言属性存在的测试:
[TestMethod]
public void Index_action_requires_authentication()
{
// If Index is overloaded, you might need to filter by argument list
MethodInfo indexMethod = typeof(MyController).GetMethod("Index");
bool requiresAuthentication =
Attribute.IsDefined(indexMethod, typeof(AuthorizeAttribute));
Assert.IsTrue(requiresAuthentication);
}
显然,您并未在此处测试授权实施,但它确实适用于文档并防止开发人员意外删除它。
如果您正在运行自定义代码,那么您可能会返回HttpStatusCodeResult
,因此您只需检查一下:
public void Index_action_requires_authentication()
{
ActionResult result = new MyController().Index();
HttpStatusCodeResult statusCodeResult = result as HttpStatusCodeResult;
Assert.IsNotNull(statusCodeResult);
Assert.AreEqual(403, statusCodeResult.StatusCode);
}
如果您手动写入HttpResponse(Response.StatusCode或Response.Headers),那么您需要像其他人所描述的那样模拟HttpContextBase
。