gpt4 book ai didi

c# - 模拟 UserManager

转载 作者:行者123 更新时间:2023-11-30 12:41:24 26 4
gpt4 key购买 nike

我有以下代码:

var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId;

它是我应用程序中 Controller 之一的一部分。现在我正在编写单元测试,应该通过这个东西来测试 Controller 的实际属性。

问题是它抛出空引用异常,因为 UserManager.FindById 返回 null。如果我可以模拟它,让它有一个名为 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 的回答,我得以解决问题。我会将解决方案作为编辑发布,因为解决方案中的某些内容未包含在问题和答案中。首先,正如@mason 所建议的,我公开了 UserManager 属性的 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 的用户传递给 Controller ​​。

最佳答案

您无法设置 UserManager 属性,因为您将 setter 设为私有(private)。公开。

public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}

现在您将能够设置 Controller 的 UserManager 属性。

关于c# - 模拟 UserManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37602566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com