我正在测试一些需要用户登录的代码。当我尝试使用AccountController
登录时,看起来一切正常,但在{ {1}} AccountController
仍然为空。我怎样才能正确登录(或者更好,我能以某种方式嘲笑它)吗?
(IPrincipal) User
这里我得到了User null异常:
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); }
}
属性null。这是来自User
的示例:
AccountController
答案 0 :(得分:1)
您应该模拟_userManager,并在调用FindAsync方法时使用模拟设置。然后你返回一个假的用户,稍后你可以在代码中使用
答案 1 :(得分:0)
我自己想出来,可能不是优雅的解决方案,但无论如何我很高兴。 @andreasnico你的回答有帮助,谢谢。
我嘲笑我的自定义ClaimsPrincipal,并设置UserId - 这就是我真正需要的。
var mockCp = new Mock<IClaimsPrincipal>();
mockCp.SetupGet(cp => cp.UserId).Returns(user.Id);
_calendarController.CurrentUser = mockCp.Object;