c# – 模拟UserManager
我有以下代码:
var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId; 它是我的应用程序中的一个控制器的一部分.现在我正在编写单元测试,并应该通过这个东西来测试控制器的实际属性. 问题是它抛出一个空引用异常,因为UserManager.FindById返回null.如果我可以模拟这个,那么它有一个名为ClientId的属性,我将能够避免异常. 我试过了什么? var fakeUserManager = new Mock<ApplicationUserManager>(); fakeUserManager.Setup(x => x.FindById(It.IsAny<string>())) .Returns(user); 但是当我尝试将controller.UserManager设置为它时: controller.UserManager = fakeUserManager.Object; Visual Studio说UserManager无法在此上下文中使用,因为set访问器不可访问. 我决定使用UserManager创建用户,但create方法再次导致空引用异常. 这就是ApplicationUserManager的设置方式: public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } } 解: 感谢@mason的回答,我能够解决问题.我将解决方案作为编辑发布,因为解决方案中的某些内容未包含在问题和答案中. public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } set { _userManager = value; } } 第二,这是不同的部分.我能够创建一个新的ApplicationUserManager并通过模拟IUserStore将其传递给用户: var store = new Mock<IUserStore<User>>(MockBehavior.Strict); store.As<IUserStore<User>>() .Setup(x => x.FindByIdAsync(It.IsAny<string>())) .ReturnsAsync(user); var manager = new ApplicationUserManager(store.Object); 然后,我只是设置controller.UserManager: controller.UserManager = manager; 备注: 解决方法
您无法设置UserManager属性,因为您将setter设为私有.把它公之于众.
public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } set { _userManager = value; } } 现在,您将能够设置控制器的UserManager属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |