如何测试需要记录用户的方法
本文关键字:记录 用户 方法 何测试 测试 | 更新日期: 2023-09-27 18:36:04
>我正在测试一些需要用户登录的代码。当我尝试使用 AccountController
登录时,看起来一切正常,但在 AccountController
(IPrincipal) User
仍然为空。我如何正确登录(或者更好的是,我可以以某种方式模拟它)?
public async Task SetupAsync()
{
var context = new DataContext();
var manager = new UserManager(new UserStore(context));
var accountController = new AccountController(manager);
var mockAuthenticationManager = new Mock<IAuthenticationManager>();
mockAuthenticationManager.Setup(am => am.SignOut());
mockAuthenticationManager.Setup(am => am.SignIn());
accountController.AuthenticationManager = mockAuthenticationManager.Object;
var user = new LoginViewModel
{
Email = "user@wp.pl",
Password = "useruser",
RememberMe = false
};
if (manager.FindByEmail("user@wp.pl") == null)
{
await manager.CreateAsync(new User { Email = "user@wp.pl", UserName = "user@wp.pl" }, "useruser");
}
await accountController.Login(user, "home/index");
_calendarController = new CalendarController(context);
}
在这里我得到了用户空异常:
public ClaimsPrincipal CurrentUser
{
get { return new ClaimsPrincipal((System.Security.Claims.ClaimsPrincipal)this.User); }
}
编辑:在返回行,我仍然User
属性为空。这是来自AccountController
的示例:
var user = await _userManager.FindAsync(model.Email, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
return RedirectToAction("index", "calendar");
}
你应该模拟你的_userManager,并在调用方法FindAsync时使用模拟设置。然后你返回一个假用户,稍后可以在代码中使用
我自己想通了,可能不是优雅的解决方案,但无论如何我很高兴。 @andreasnico您的回答有帮助,谢谢。
我正在嘲笑我的自定义 ClaimsPrincipal,并设置 UserId - 这是我真正需要的。
var mockCp = new Mock<IClaimsPrincipal>();
mockCp.SetupGet(cp => cp.UserId).Returns(user.Id);
_calendarController.CurrentUser = mockCp.Object;