我有一个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
是空的。我怎么能把这个模拟到我的测试中,这样我的测试就可以通过了?