缺少类型映射配置或不支持 IdentityRole 的映射。

3

我正在编写 单元测试,但这个 映射器(mapper) 又让我头疼了。从之前的帖子中我了解到,我不能 Mock(模拟) 这个 映射器 ,必须直接使用它。因此,我创建了 maps(地图),但它显示缺少类型 map configuration(地图配置)

    public RoleDto GetSingle([FromRoute] string id)
    {
        var r = roleManagerWrapper.GetSingleRole(id);
        return mapper.Map<RoleDto>(r);
    }

当它试图map对象时,它会出现错误。是否需要实现Task <IdentityRole>的特殊mapping

    public async Task<IdentityRole> GetSingleRole(string roleId)
    {
        var role = await this.roleManager.Roles.SingleOrDefaultAsync(r => r.Id == roleId);

        return role;
    }

这是我的测试,仅计算创建的角色数量。
    [Test]
    public async Task Get_Single()
    {
        TestSetup();

        var roleManagerWrapperMock = new Mock<IRoleManagerWrapper>();


        var adminRole = new IdentityRole()
        {
            Name = "Admin",
            Id = "4a8de423-5663-4831-ac07-7ce92465b008"
        };

        var managerRole = new IdentityRole()
        {
            Name = "Manager",
            Id = "40f74162-3359-4253-9b5a-ad795b328267"
        };
        ApplicationDbContext.Roles.Add(managerRole);
        ApplicationDbContext.Roles.Add(adminRole);

        ApplicationDbContext.SaveChanges();

        var sut = new RolesController(roleManagerWrapperMock.Object, ApplicationDbContext, Mapper);
        var result = sut.GetSingle("4a8de423-5663-4831-ac07-7ce92465b008");
        Assert.AreEqual(result.UserCount, 1);
    }


       protected void TestSetup(string databaseName = null)
       {
        if (databaseName == null)
        {
            databaseName = GetTestName();
        }

        TestCleanup();
        ServiceProvider = new ServiceCollection()
            .AddEntityFrameworkInMemoryDatabase()
            .BuildServiceProvider();

        dbContextOptions = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(databaseName)
            .UseInternalServiceProvider(ServiceProvider)
            .Options;

        ApplicationDbContext = new ApplicationDbContext(dbContextOptions);

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<RoleDto, IdentityRole>();
            cfg.CreateMap<IdentityRole, RoleDto>();
            cfg.CreateMap<CreateRoleDto, IdentityRole>().ReverseMap();
            cfg.CreateMap<UpdateRoleDto, IdentityRole>().ReverseMap();
        });
         Mapper = config.CreateMapper();
    }
1个回答

2

这个操作需要重构,以使用正确的异步语法,因为GetSingleRole返回Task<IdentityRole>

public Task<RoleDto> GetSingle([FromRoute] string id) {
    IdentityRole r = await roleManagerWrapper.GetSingleRole(id);
    return mapper.Map<RoleDto>(r);
}

并且测试已相应更新

[Test]
public async Task Get_Single() {
    //Arrange
    TestSetup();

    var roleManagerWrapperMock = new Mock<IRoleManagerWrapper>();

    //...omitted for brevity

    var sut = new RolesController(roleManagerWrapperMock.Object, ApplicationDbContext, Mapper);

    //Act
    RoleDto result = await sut.GetSingle("4a8de423-5663-4831-ac07-7ce92465b008");

    //Assert
    Assert.AreEqual(result.UserCount, 1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接