2017-02-08 53 views
2

我想为我的嘲笑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); 
} 

回答

1

虽然角色是一个只读属性,它是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); 
} 
相关问题