【发布时间】:2018-11-26 12:08:55
【问题描述】:
我有一个关于为结合 MVVM 的 Razor 页面编写单元测试的问题。我想测试 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 分配给这些方法?
【问题讨论】:
-
User上的User属性是只读的吗? -
继承自PageModel,貌似是public的
-
您需要通过作为 PageContext 一部分的模拟 http 上下文来设置用户。
-
@Nkosi 感谢您的快速回复,我现在正在查看。我之前尝试过模拟一个 httpcontext,但它似乎不起作用,但我会再试一次。
标签: c# unit-testing asp.net-core razor-pages