【问题标题】:Unit Testing .NET Core Web API Controllers with JWT Claims [duplicate]使用 JWT 声明对 .NET Core Web API 控制器进行单元测试 [重复]
【发布时间】:2017-04-15 18:11:38
【问题描述】:

我正在尝试测试一种控制器方法,该方法利用 JWT 声明来获取客户端的用户名,如下所示:

[Authorize]
[Route("api/[controller]")]
public class ApprovalsController : Controller
{
  // POST api/approvals
    [HttpPost]
    public IActionResult Post([FromBody]ApprovalViewModel value)
    {
        // ...

        // Incoming approval VM converted here
        Approval newApproval = TinyMapper.Map<Approval>(value);

        // Values set server-side here.
        newApproval.Id = -1;
        newApproval.Created = DateTime.Now;

        // Claim queried here
        newApproval.CreatedBy = User.FindFirst(ClaimTypes.Name).Value; 

        // Submission to context
        _approvalRepo.Insert(newApproval);
        _approvalRepo.Update();

        // ...
    }

但我非常幸运地尝试想出一种使用 Moq 和 XUnit 对上述控制器进行单元测试的方法。我搜索的许多问题都涉及直接设置控制器的 ControllerBase.User 属性,但是在 Aspnetcore.MVC (1.1.1) 中,User 已设置为 只读.

在这里,我要做什么?

【问题讨论】:

  • @Nkosi 出于自我教育的目的,您能否解释一下为什么这个问题与所链接的问题完全相同相同?有相似之处,但伊利亚的回答直接而简单,我认为这是值得的。

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


【解决方案1】:

Controller.User 只是Controller.ControllerContext.HttpContext.User 的包装。首先模拟任何上下文:

var controller = new HomeController();

var contextMock = new Mock<HttpContext>();
contextMock.Setup(x => x.User).Returns(new ClaimsPrincipal());

controller.ControllerContext.HttpContext = contextMock.Object;

Assert.NotNull(controller.User);

【讨论】:

  • 不知道是不是由于 .NET 最近的变化,但 HttpContext 现在期待 HttpContextBase。只是想我会提到它。
猜你喜欢
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多