nЗаменить проблему с макетом httpContext и сессией из-за ожидаемого файла cookie - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть приложение MVC, где я пытаюсь смоделировать мой домашний контроллер так, чтобы мой controller.Index() был вызван.

Проблема в конструкторе моего homeController.Вот фактический код:

 public HomeController(IHttpContextAccessor httpContext, IUserRepository<CompanyUser> userRepository, IAuthorisationChecks authorisationChecks) : base(httpContext, userRepository, authorisationChecks)
    {

    }

, и у моего базового класса есть следующее:

public  ControllerBase(IHttpContextAccessor httpContext,IUserRepository<CompanyUser> userRepository,IAuthorisationChecks authorisationChecks)
    {
        _authorisationChecks = authorisationChecks;
        _userRepository = userRepository;
        _httpContext = httpContext;

        var cookie = _httpContext.HttpContext.Request.Cookies["auth"];
        var userCookie = _authorisationChecks.UnencryptedCookieValue("userdata", cookie);

       var userDeserialised = JsonConvert.DeserializeObject<SignInModel>(userCookie);
            userDeserialised.SessionId = _httpContext.HttpContext.Session.Id;
        var loggedInUser = Task.Run(async () => await _userRepository.SignInAsync(userDeserialised)).Result;
        _httpContext.HttpContext.Session.SetCurrentUser(loggedInUser);

    }

в моем тесте, который у меня сейчас есть:

[Fact]
    public void Index_Returns_Correct_View_Test()
    {
        // Arrange

        var httpRequest = Substitute.For<HttpRequest>();
        var session = Substitute.For<ISession>();
        var httpResponse = Substitute.For<HttpResponse>();
        var httpContext = Substitute.For<IHttpContextAccessor>();
        var userRepository = Substitute.For<IUserRepository<EvaluateUser>>();
        var authorisationChecks = Substitute.For<IAuthorisationChecks>();

        userRepository.SignInAsync(new SignInModel
        {
            EmailAddress = _configuration["user:emailAddress"],
            Password = _configuration["user:password"],
            UserName = _configuration["user:username"],
            SessionId = _configuration["user:sessionId"]
        });

        session.Id.Returns(_configuration["user:sessionId"]);

        httpContext.HttpContext.Request.Returns(httpRequest);
        httpContext.HttpContext.Session.Returns(session);
        httpContext.HttpContext.Response.Returns(httpResponse);


        var controller = new HomeController(httpContext, userRepository, authorisationChecks);

        // Act
        var result = controller.Index();

        // Assert
        Assert.NotNull(result);
    }

Когда я пытаюсьдля запуска теста происходит сбой в строке в controllerBase, которая пытается установить userDeserialised.SessionID, поскольку var cookie пусто.Как я могу смоделировать это в моем тесте, чтобы мой тест прошел?

1 Ответ

0 голосов
/ 03 декабря 2018

Вы сможете удалить содержимое cookie, а затем _authorisationChecks:

val authCookie = "my-cookie-content";
httpContext.HttpContext.Request.Cookies["auth"].Returns(authCookie);

val userCookie = "{ json serialised sign-in model here }";
_authorisationChecks.UnencryptedCookieValue("userdata", authCookie).Returns(userCookie);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...