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

时间:2016-02-23 21:35:17

标签: c# asp.net-mvc nunit

我正在测试一些需要用户登录的代码。当我尝试使用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

2 个答案:

答案 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;