c# - 模拟 ApplicationUser 并提供角色

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

我正在尝试为我的模拟 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);
}

最佳答案

虽然 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);
}

关于c# - 模拟 ApplicationUser 并提供角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42123869/

相关文章:

perl - 在 perl 中 stub 和模拟一个用于单元测试的子程序

mocking - 如何将一次方案应用于列表元素?

c# - 使用最小起订量 : mock object throwing 'TargetParameterCountException'

unit-testing - Golang - 多个包的有效测试

java - 在 Eclipse 中的测试套件中运行单个测试

c# - 使用 Azure 移动服务的 Azure Active Directory 身份验证失败

c# - 如何在 Azure.Messaging.ServiceBus 中克隆消息,版本=7.1.2.0

javascript - Angular 单元测试类型错误: Cannot read property 'subscribe' of undefined

c# - 以编程方式在 Sharepoint 2010 中添加用户控件

c# - 从托管代码调用 native 函数