.net core mvc模拟身份和声明并测试用户是否声明

时间:2017-12-07 09:08:19

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

我正在尝试对我的控制器逻辑进行单元测试,它是一个(.Net核心2 mvc应用程序)我有一个控制器,如果用户有特定声明,则返回项目的详细信息,我想使用XUnit进行单元测试

这是控制器:

public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var controlException = await _context.ControlException.FirstOrDefaultAsync(m => m.Id == id);

    if (controlException == null)
    {
        return NotFound();
    }
    if (User.HasClaim("control Claim", "control Claim"))
    {
            return View(controlException);
    }
    else
    {
        return RedirectToAction("AccessDenied", "Account");
    }

}

我的单元测试代码是:(GetContextWithData()返回InMemory测试数据库)

[Fact]
public async Task VerifyDetailsViewType()
{

    using (var context = GetContextWithData())
    using (var _controller = new ControlExceptionsController(context))
    {      
        var userStore = new Mock<IUserStore<ApplicationUser>>();

        var userManager = new UserManager<ApplicationUser>(
                         userStore.Object, null, null, null, null, null, null, null, null);

        var cp = new Mock<ClaimsPrincipal>();
        cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>()))
          .Returns(true);
        cp.Setup(m => m.Identity).Returns(identityMock.Object);

        _controller.ControllerContext.HttpContext = new DefaultHttpContext();
        _controller.ControllerContext.HttpContext.Request.Headers["Referer"] = "http://www.test.nl";

        var result = await _controller.Details(888);
        Assert.IsType<ViewResult>(result);
    }
}

我的测试失败,因为结果是“RedirectToAction”而不是“ViewResult”。

我知道,因为用户没有声明,所以问题是我如何为用户分配声明,换句话说,我如何模仿Identity并声明并管理它。

1 个答案:

答案 0 :(得分:0)

您需要将主体分配给控制器,以允许代码根据需要运行至完成。

您模拟了主体但未在测试中将其分配给控制器。

_controller.ControllerContext.HttpContext.User = cp.Object;