如何测试需要记录用户的方法

本文关键字:记录 用户 方法 何测试 测试 | 更新日期: 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;