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

本文关键字:无效 操作 错误 显示 IsAuthenticated HttpContext Request filterContext | 更新日期: 2023-09-27 17:50:35

我正在写单元测试。我是单元测试的新手。我不知道如何测试这个方法。我应该单元测试私有方法吗?我正在使用rhino mock。

        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;
    }

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

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

编写单元测试时需要问自己的问题:

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

  2. 这个方法是做什么的?(即算法是什么)指定参数及其变化和预期结果(例如返回值)。

  3. 确定基本情况(即一切都按照预期进行)用这些参数编写一个单元测试,并断言预期的结果

  4. 识别其他情况(如登录失败、输入参数错误等)通过断言结果来验证方法的行为是否正确。

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

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

见解释:

当测试只调用公共方法时,很容易在类实现中进行任何重构(提取新的私有方法,重命名它们,更改私有方法的参数等)。测试将保证一切正常。
在这种情况下,测试集是类的规范。它说应该做什么,但没有说应该怎么做

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

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

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