Я бы хотел 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);
}