2017-02-08 14 views
2

Я пытаюсь представить ApplicationUser моему издеваемому ApplicationUserManager. Когда я пытаюсь добавить роли, я замечаю, что Roles - свойство только для чтения. Не уверен, что лучший способ реализовать в моем тесте.Mock ApplicationUser и предоставить роли

[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"; 

Как и в сторону, метод испытания также может быть сделан async

[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); 
}