模拟ApplicationUser并提供角色

时间:2017-02-08 21:24:22

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

我正在尝试向我的模拟ApplicationUser提供ApplicationUserManager。当我尝试添加角色时,我注意到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);
}

1 个答案:

答案 0 :(得分:3)

虽然Roles是一个只读属性,但它是sudo -H pip install requests[security] --upgrade --ignore-installed six,这意味着它可以在派生类中被覆盖。因此,您可以创建一个派生自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";