使用xUnit编写单元测试时,如何在控制器方法内达到int变量

时间:2018-11-02 19:55:21

标签: c# unit-testing asp.net-core xunit

我正在尝试为控制器编写单元测试。我正在使用xUnit测试我的methots。

我可以在控制器内部到达“ changePasswordX”方法进行测试,但无法到达我的userId变量和声明值以检查它们是否相等?

如何在xUnit中测试此代码?

    [HttpGet("ChangePassword")]
    public async Task<IActionResult> ChangePassword(int userId, oldPassword, newPassword)
    {      
        if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
            return Unauthorized();

         _repo.changePasswordX(userId, oldPassword, newPassword);

        return Ok();
    }

2 个答案:

答案 0 :(得分:1)

单元测试不会测试方法每个步骤的每个中间结果。

单元测试旨在在给定某些输入的情况下测试方法的整体输出或返回值。

如果您需要测试该行代码,则将其放在一个单独的位置(库)中,在该位置可以对其进行调用并进行测试。

答案 1 :(得分:1)

目前尚不清楚您实际上要达到什么目的,但是无论如何,这都是编写单元/集成测试的错误方法。在单元测试中,您不应该测试userId的值,也不应该对声明进行测试。您知道,如果不匹配,操作将返回并显示一个UnauthorizedResult,如果匹配,您将得到一个OkResult。如果您正在进行单元测试,则只需将用户主体存根,将操作作为方法调用,然后验证返回值即可。如果您要进行集成测试,则过程大致相同:您授权呼叫,并根据要测试的情况验证状态码是401还是200。