首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嘲弄UserManager

嘲弄UserManager
EN

Stack Overflow用户
提问于 2016-06-02 21:39:04
回答 1查看 1.6K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId;

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

问题是它抛出一个空引用异常,因为UserManager.FindById返回null。如果我能够模拟它,因此它有一个名为ClientId的属性,我将能够避免异常。

我试过什么?首先,嘲笑UserManager本身:

代码语言:javascript
复制
  var fakeUserManager = new Mock<ApplicationUserManager>();
  fakeUserManager.Setup(x => x.FindById(It.IsAny<string>()))
  .Returns(user);

但是当我尝试将我的controller.UserManager设置为它时:

代码语言:javascript
复制
controller.UserManager = fakeUserManager.Object;

Visual说,由于无法访问set访问器,因此无法在此上下文中使用UserManager。

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

以下是如何设置ApplicationUserManager:

代码语言:javascript
复制
public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
            }
            private set
            {
                _userManager = value;
            }
        }

解决方案:

多亏了梅森的回答,我才能解决这个问题。我将把解决方案作为编辑发布,因为在解决方案中有一些东西没有包括在问答中。首先,正如@mason建议的那样,我将UserManager地产的策划人公之于众。

代码语言:javascript
复制
public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
            }

          set
            {
                _userManager = value;
            }
        }

第二,这是不同的部分。我能够创建一个新的ApplicationUserManager,并通过模拟IUserStore传递给它一个用户。

代码语言:javascript
复制
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:

代码语言:javascript
复制
controller.UserManager = manager;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-02 22:54:14

您不能设置UserManager属性,因为您将setter设置为私有。公之于众。

代码语言:javascript
复制
public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    set
    {
        _userManager = value;
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37602566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档