模拟UserManager

时间:2016-06-02 21:39:04

标签: c# asp.net asp.net-web-api authorization moq

我有以下代码:

local enemy = require("enemy")

enemyTable = setmetatable({}, {__index = enemy})

table.insert(enemyTable, enemy.new())
table.insert(enemyTable, enemy.new())
table.insert(enemyTable, enemy.new())

enemyTable:move()

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

问题是它会抛出空引用异常,因为var clientId = this.UserManager.FindById(this.User.Identity.GetUserId()).ClientId; 返回UserManager.FindById。如果我可以模拟它,所以它有一个名为ClientId的属性,我将能够避免异常。

我尝试了什么? 首先嘲笑UserManager本身:

null

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

  var fakeUserManager = new Mock<ApplicationUserManager>();
  fakeUserManager.Setup(x => x.FindById(It.IsAny<string>()))
  .Returns(user);

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

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

这就是ApplicationUserManager的设置方式:

controller.UserManager = fakeUserManager.Object;

解决方案:

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

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

其次,这是不同的部分。我能够创建一个新的public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } set { _userManager = value; } } 并通过模拟ApplicationUserManager将其传递给用户:

IUserStore

然后,我只需设置controller.UserManager:

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 = manager; 变量帮助我将具有ClientId的用户传递给控制器​​。

1 个答案:

答案 0 :(得分:1)

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

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

现在您可以设置控制器的UserManager属性。