filterContext.HttpContext.Request.IsAuthenticated显示无效的操作错误

时间:2013-01-04 11:20:29

标签: c# asp.net-mvc-3 model-view-controller request nunit

我正在编写单元测试。我是单元测试的新手。我不知道如何测试这种方法。我应该单独测试私有方法吗?我正在使用犀牛模拟。

        private bool RedirectToAppraiserProfilePage(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAuthenticated) { return false; }
        IPrincipal principal = filterContext.HttpContext.User;
        if (!principal.IsInRole(RoleEnum.Appraiser.ToString())) { return false; }
        if (!this.GetType().IsDefined(typeof(ForbidDisagreedAppraisers), true)) { return false; }
        AppraiserDTO appraiser = this.employeeService.GetLoggedInAppraiser();
        return !appraiser.AcceptTermsOfAgreement;
    }

2 个答案:

答案 0 :(得分:0)

通常我不会测试私有方法,但似乎你需要一些关于单元测试真正是什么以及你应该如何处理问题的一般指导。

编写单元测试时需要问自己的是什么:

  1. 我测试的方法是无状态的吗? (即不依赖于其他方法或模块) 如果是 - 可以编写单元测试|如果不是 - 是否可以使用依赖注入或模拟/存根来使方法无状态以用于测试目的?例如,在您的情况下,我将更改方法签名以将IAuthorizationComponent接口作为参数,以便您可以使用依赖注入通过发送自己的实现来测试您的方法(filterContext)

  2. 该方法有何作用? (即,算法是什么) 指定参数及其变体和预期结果(例如返回值)。

  3. 确定基本情况(即一切按预期进行) 使用这些参数编写单元测试并声明预期结果。

  4. 识别替代案例(例如登录失败,输入参数错误等) 通过断言结果来验证方法是否正确。

答案 1 :(得分:0)

关于测试私有方法的问题:

您应该通过调用公共方法来测试在私有方法中实现的功能。

请参阅解释原因:

当测试只调用公共方法时,很容易在类实现中进行任何重构(提取新的私有方法,重命名它们,更改私有方法的参数等)。并且测试将保证everithing仍然运作良好 在这种情况下,测试集对于类来说是规范。它说应该做什么但不要说应该如何

当测试调用私有方法时,重构不能这么简单。您还需要重写测试。当然,这些测试无法保证代码在重构后仍能正常工作 此外,有必要测试公共方法并检查它们是否正确调用私有方法。因为任何经过良好测试的私有方法如果公共方法不使用它就没用。

关于filterContext.HttpContext.Request.IsAuthenticated错误的问题:

我认为因为filterContext.HttpContext在单元测试范围内无效。您可以找到有关模拟HttpContext的详细信息,例如here