【问题标题】:Mock ApplicationUser and provide roles模拟 ApplicationUser 并提供角色
【发布时间】:2017-02-08 21:24:21
【问题描述】:

我正在尝试为我模拟的ApplicationUserManager 提供一个ApplicationUser。当我尝试添加角色时,我注意到Roles 是一个只读属性。不确定在我的测试中实现的最佳方法。

[TestMethod]
public void AccountPerission_PermissionScope()
{
    //Arrange
    IRolePermissionSvc roleService = GetRoleService();
    IUserPermissionSvc userService = GetUserService();

    AccountController controller = new AccountController(
        _applicationUserManager.Object, 
        null,
        _staffTypeSvc.Object,
        _militaryBaseSvc.Object,
        _positionTitleSvc.Object,
        userService,
        roleService
        );

    var appUser = new ApplicationUser()
    {
        FirstName = "test",
        LastName = "tester",
        Id = "02dfeb89-9b80-4884-b694-862adf38f09d",
        Roles = new List<ApplicationRoles> { new ApplicationRole { Id = "1" } } // This doesn't work.
    };

    //Act
    _applicationUserManager.Setup(x => x.FindByIdAsync(It.IsAny<string>())).Returns(Task.FromResult<ApplicationUser>(appUser));
    Task<PartialViewResult> result = controller.AjaxResetUserPermission(appUser.Id, 1);

    //Assert
    Assert.IsNotNull(result);
}

【问题讨论】:

    标签: c# unit-testing mocking asp.net-identity moq


    【解决方案1】:

    虽然 Roles 是一个只读属性,但它是 virtual,这意味着它可以在派生类中被覆盖。所以你可以创建一个派生自ApplicationUser的类

    public class MockApplicationUser : ApplicationUser {
        private readonly ICollection<ApplicationRoles> roles
    
        public MockedApplicationUser(List<ApplicationRoles> roles) : base() {
            this.roles = roles;
        }
    
        public override ICollection<ApplicationRoles> Roles {
            get { return roles; }
        }
    }
    

    并在测试中使用它

    var appUser = new MockApplicationUser(new List<ApplicationRoles> { new ApplicationRole { Id = "1" } })
    {
        FirstName = "test",
        LastName = "tester",
        Id = "02dfeb89-9b80-4884-b694-862adf38f09d"
    };
    

    或模拟 ApplicationUser 并设置 Roles 属性

    var roles = new List<ApplicationRoles> { new ApplicationRole { Id = "1" } };
    var appUserMock = new Mock<ApplicationUser>();
    appUserMock.SetupAllProperties();
    appUserMock.Setup(m => m.Roles).Returns(roles);
    
    var appUser = appUserMock.Object;    
    appUser.FirstName = "test";
    appUser.LastName = "tester";
    appUser.Id = "02dfeb89-9b80-4884-b694-862adf38f09d";
    

    顺便说一句,测试方法也可以异步

    [TestMethod]
    public async Task AccountPerission_PermissionScope() {
        //Arrange
    
        //..code removed for brevity
    
        _applicationUserManager
            .Setup(x => x.FindByIdAsync(It.IsAny<string>()))
            .ReturnsAsync(appUser);
    
        //Act    
        var result = await controller.AjaxResetUserPermission(appUser.Id, 1);
    
        //Assert
        Assert.IsNotNull(result);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 2023-03-14
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2014-08-26
      相关资源
      最近更新 更多