我遇到了一个有关编写Razor页面结合MVVM单元测试的问题。我想要测试Razor中的OnPostAsync()
方法,但是这个方法会调用另外两个需要ClaimsPrincipal
用户的方法。然而,在我的测试中,我无法将User
作为这些方法的参数。
目前我的测试方法如下:
[Test]
public void MakeBookingTest()
{
//Arrange
var optionsbuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsbuilder.UseInMemoryDatabase(databaseName: "TeacherDB");
var _dbContext = new ApplicationDbContext(optionsbuilder.Options);
JsonResult json = new JsonResult(true);
_dbContext.ImportOption.Add(new ImportOption { Id = 1, isUnique = 1, Option = "Teacher" });
_dbContext.SaveChanges();
var mockedUserManager = GetMockUserManager();
var mockedCalendar = new Mock<ICalendarService>();
Booking booking = new Booking {
EventId = "2",
ClassroomId = 3,
BeginTime = DateTime.Now,
EndTime = DateTime.Now,
Description = "fjdkafjal",
Summary = "Test01" };
mockedCalendar.Setup(x => x.CreateEvent(booking, "2", "0863629@hr.nl", false)).Returns("111");
var mockedRoleManager = GetMockRoleManager();
var model = new MakeBookingModel(_dbContext, mockedUserManager.Object, mockedCalendar.Object, mockedRoleManager.Object);
//var controllerContext = new Mock<ControllerContext>();
var result = model.OnPostAsync();
}
我想要测试的方法:
[ValidateAntiForgeryToken]
public async Task<IActionResult> OnPostAsync()
{
CurrentRole = await _validation.GetCurrentRole(User);
CurrentUser = await _userManager.GetUserAsync(User);
//(rest of the code...)
_validation.GetCurrentRole
方法:
public async Task<string> GetCurrentRole(ClaimsPrincipal User)
{
ApplicationUser currentUser = await _userManager.GetUserAsync(User);
Task<IList<string>> rolesUser = _userManager.GetRolesAsync(currentUser);
return rolesUser.Result.First();
}
我似乎无法让OnPostAsync
/GetCurrentRole
中的User
不为null。
我该如何将User
分配给这些方法?
MakeBookingModel
上的User
属性是只读的吗? - NkosiDefaultHttpContext
的示例,这样您就不需要模拟它。 - NkosiMakeBookingModel
是什么。一个服务?模型类?从方法和反伪造令牌来看,它更像是一个控制器,这使得它更像是一个集成测试。对于它,请使用TestServer
类。因此,你试图实现什么完全不清楚。 - Tseng