代码之家  ›  专栏  ›  技术社区  ›  bilpor

由于预期的cookie而模拟httpContext和会话的非抽象问题

  •  1
  • bilpor  · 技术社区  · 6 年前

    我有一个MVC应用程序,我试图模仿我的家庭控制器,这样我的 controller.Index() 应该被调用。

    问题出在我的主控制器的构造函数上。这是实际代码:

     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 回复  |  直到 6 年前
        1
  •  0
  •   David Tchepak    6 年前

    您应该能够截取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);