.net core mvc Mocking Identity и претензии и проверьте, есть ли у пользователя претензии

Я пытаюсь выполнить модульное тестирование своей логики контроллера, это (приложение .Net core 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 и претензиями и управлять этим.


person Saad Hasan    schedule 07.12.2017    source источник
comment
Куда вы назначаете пользователя контроллера в тесте? Вы его создаете, но я не вижу, где вы его назначаете пользователю.   -  person Nkosi    schedule 07.12.2017
comment
Когда я назначаю заявку пользователю th: await userManager.AddClaimAsync (user, new Claim (control Claim, control Claim)); Я получаю эту ошибку: NotSupportedException: Store не реализует IUserClaimStore ‹TUser›.   -  person Saad Hasan    schedule 07.12.2017
comment
Нет, вы назначаете принципала User контекста. _controller.ControllerContext.HttpContext.User = cp.Object;   -  person Nkosi    schedule 07.12.2017


Ответы (1)


Вам необходимо назначить принципала контроллеру, чтобы разрешить выполнение кода до завершения по желанию.

Вы издеваетесь над принципалом, но не назначаете его контроллеру в тесте.

_controller.ControllerContext.HttpContext.User = cp.Object;
person Nkosi    schedule 07.12.2017
comment
Спасибо @Nkosi, вот и все. - person Saad Hasan; 07.12.2017