У меня есть приложение 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
пусто.Как я могу смоделировать это в моем тесте, чтобы мой тест прошел?