1

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

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

2 回答 2

0

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

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

见解释为什么:

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

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

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

我相信这是因为filterContext.HttpContext在单元测试范围内无效。您可以在此处HttpContext找到有关模拟的详细信息。

于 2013-01-04T19:13:15.817 回答
0

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

在编写单元测试时你需要问自己:

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

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

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

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

于 2013-01-04T11:53:53.347 回答