Модульное тестирование автомата, чтобы вернуть количество пользователей в роли - PullRequest
2 голосов
/ 17 января 2020

Я бы хотел unit test это Controller. Он возвращает имя role и count из users, принадлежащих этому role:

    [HttpGet]
    [EnableQuery]
    public IEnumerable<RoleDto> Get()
    {
        var roles = dbContext.Roles.ToList();

        return roles.Select(r =>
        {
            var dto = mapper.Map<RoleDto>(r);
            dto.UserCount = dbContext.UserRoles.Count(x => x.RoleId == r.Id); 
            return dto;
        }).ToList();
    }

И вот мой тест - DTO всегда null и позже бросает exception. Я не могу map это правильно.

Это простой unit test, который создает user, создает roles и добавляет user к этим roles.

Затем проверяется, был ли добавлен user к этому role.

    [Test]
    public async Task Get_Should_Return_List_OfRoles()
    {
        TestSetup();
        var mapperMock = new Mock<IMapper>();
        IdentityRole role = null;

        mapperMock.Setup(u => u.Map<RoleDto>(It.IsAny<IdentityRole>()))
            .Callback<object>(inputargs => role = inputargs as IdentityRole);
        var roleManagerWrapperMock = new Mock<IRoleManagerWrapper>();

        var admin = new IntentUser
        {
            UserName = "Administrator2",
            Email = "admin2@intent2.app",
            EmailConfirmed = true,
            IsEnabled = true,
            IsSystemUser = true
        };

        var adminRole = new IdentityRole()
        {
            Name = "Admin"
        };

        var managerRole = new IdentityRole()
        {
            Name = "Manager"
        };
        ApplicationDbContext.Users.Add(admin);
        ApplicationDbContext.Roles.Add(managerRole);
        ApplicationDbContext.Roles.Add(adminRole);

        ApplicationDbContext.SaveChanges();

        var adminRoleAdded = new IdentityUserRole<string>()
        {
            RoleId = adminRole.Id,
            UserId = admin.Id
        };

        var managerRoleAdded = new IdentityUserRole<string>()
        {
            RoleId = managerRole.Id,
            UserId = admin.Id
        };

        ApplicationDbContext.UserRoles.Add(adminRoleAdded);
        ApplicationDbContext.UserRoles.Add(managerRoleAdded);
        ApplicationDbContext.SaveChanges();

            var sut = new RolesController(roleManagerWrapperMock.Object, ApplicationDbContext, mapperMock.Object);
            var result = sut.Get();
            foreach (var roleDto in result)
            {
                Assert.AreEqual(roleDto.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);
    }

1 Ответ

3 голосов
/ 17 января 2020

Как уже упоминалось в комментариях, вы можете использовать настоящий маппер вместо того, чтобы пытаться имитировать его.

//...

//Configure mapping just for this test but something like this
//should be in accessible from your composition root and called here.
var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<RoleDto, IdentityRole>();
    cfg.CreateMap<IdentityRole, RoleDto>();
});

IMapper mapper = config.CreateMapper();
// or
//IMapper mapper = new Mapper(config);

//...

Ссылка Automapper: Руководство по началу работы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...