如何在mvc 5中创建测试页面需要授权的单元测试

时间:2014-02-07 20:30:08

标签: asp.net-mvc unit-testing tdd asp.net-mvc-5

我正在尝试研究如何编写一个测试控制器授权工作的单元测试。 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();
    }

1 个答案:

答案 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