模拟 UserManager
Mocking UserManager
我有以下代码:
var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId;
它是我应用程序中控制器之一的一部分。现在我正在编写单元测试,应该通过这个东西来测试控制器的实际属性。
问题是因为UserManager.FindById
returnsnull
所以抛出空引用异常。如果我可以模拟它,所以它有一个名为 ClientId 的 属性,我将能够避免异常。
我尝试了什么?
首先模拟 UserManager 本身:
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 创建用户,但是创建方法再次导致空引用异常。
这是 ApplicationUserManager 的设置方式:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
解决方案:
感谢@mason 的回答,我得以解决问题。我将 post 解决方案作为编辑,因为解决方案中的某些内容未包含在问题和答案中。
首先,正如@mason 建议的那样,我制作了 UserManager 属性 public 的 setter。
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;
备注:
user
变量帮助我将具有 ClientId 的用户传递给控制器。
您无法设置 UserManager 属性,因为您将 setter 设为私有。做到 public.
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
现在您可以设置控制器的 UserManager 属性。
我有以下代码:
var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId;
它是我应用程序中控制器之一的一部分。现在我正在编写单元测试,应该通过这个东西来测试控制器的实际属性。
问题是因为UserManager.FindById
returnsnull
所以抛出空引用异常。如果我可以模拟它,所以它有一个名为 ClientId 的 属性,我将能够避免异常。
我尝试了什么? 首先模拟 UserManager 本身:
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 创建用户,但是创建方法再次导致空引用异常。
这是 ApplicationUserManager 的设置方式:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
解决方案:
感谢@mason 的回答,我得以解决问题。我将 post 解决方案作为编辑,因为解决方案中的某些内容未包含在问题和答案中。 首先,正如@mason 建议的那样,我制作了 UserManager 属性 public 的 setter。
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;
备注:
user
变量帮助我将具有 ClientId 的用户传递给控制器。
您无法设置 UserManager 属性,因为您将 setter 设为私有。做到 public.
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
现在您可以设置控制器的 UserManager 属性。