我有以下代码:
var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId;它是我应用程序中的一个控制器的一部分。现在我正在编写单元测试,应该通过这个测试来测试控制器的实际属性。
问题是它抛出一个空引用异常,因为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说,由于无法访问set访问器,因此无法在此上下文中使用UserManager。
我决定使用UserManager创建一个用户,但是create方法再次导致一个空引用异常。
以下是如何设置ApplicationUserManager:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}解决方案:
多亏了梅森的回答,我才能解决这个问题。我将把解决方案作为编辑发布,因为在解决方案中有一些东西没有包括在问答中。首先,正如@mason建议的那样,我将UserManager地产的策划人公之于众。
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的用户传递给控制器。
发布于 2016-06-02 22:54:14
您不能设置UserManager属性,因为您将setter设置为私有。公之于众。
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}现在您将能够设置控制器的UserManager属性。
https://stackoverflow.com/questions/37602566
复制相似问题