微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 模拟UserManager

我有以下代码

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 Studio说UserManager无法在此上下文中使用,因为set访问器不可访问.

我决定使用UserManager创建用户,但create方法再次导致空引用异常.

这就是ApplicationUserManager的设置方式:

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

解:

感谢@mason的回答,我能够解决问题.我将解决方案作为编辑发布,因为解决方案中的某些内容未包含在问题和答案中.
首先,正如@mason所建议的那样,我将UserManager属性的setter设为public.

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;

备注:
用户变量帮助我将具有ClientId的用户传递给控制器​​.

解决方法

您无法设置UserManager属性,因为您将setter设为私有.把它公之于众.

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

现在,您将能够设置控制器的UserManager属性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐