Em asp.net core 6 estou utilizando mariadb e tenho uma Controller que em seu construtor faz injecao de dependencia da IService, na sua Service faz Injecao para sua IRepository e sua Repository herda de uma GenericRepository que ai sim contem a injecao de DBcontext.
eu quero utilizar um banco em memoria durante o teste para isso crie DataBaseFixture : IDisposable
que ja popula tambem alguns dados, porem a minha dificuldade esta em como implementar os testes e informar que é para utilizar o Context de DataBaseFixture.
ArtistaController.cs
[Route("api/[controller]")]
public class ArtistaController : ControllerBase
{
private readonly IArtistaService _artistaService;
public ArtistaController(IArtistaService context)
{
_artistaService = context;
}
...
ArtistaService:
public class ArtistaService : IArtistaService
{
private readonly IArtistaRepository _artistaRepository;
private readonly IContextRepository _contextRepository;
public ArtistaService(IArtistaRepository artistaRepository, IContextRepository contextRepository)
{
_artistaRepository = artistaRepository;
_contextRepository = contextRepository;
}
...
ArtistaRepository:
public class ArtistaRepository : GenericRepository<ArtistaModel>, IArtistaRepository
{
public ArtistaRepository(OrientoonContext context) : base(context)
{
}
}
GenericRepository.cs:
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
protected readonly OrientoonContext _context;
protected readonly DbSet<T> _dbSet;
public GenericRepository(OrientoonContext context)
{
_context = context;
_dbSet = context.Set<T>();
}
...
DataBaseFixture.cs:
public class DataBaseFixture : IDisposable
{
public OrientoonContext Context { get; private set; }
public DataBaseFixture()
{
var options = new DbContextOptionsBuilder<OrientoonContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
Context = new OrientoonContext(options);
SeedDatabase();
}
private void SeedDatabase()
{
Context.Artista.AddRange(
new ArtistaModel { Id = "1", nome = "Oda" },
new ArtistaModel { Id = "2", nome = "Echiro" },
new ArtistaModel { Id = "3", nome = "Echiro Oda" }
);
...
o result esta sempre me retornando null ja tentei diversas formas ArtistaControllerTest.cs:
public class ArtistaControllerTest : IClassFixture<DataBaseFixture>
{
private readonly DataBaseFixture _fixture;
private readonly Mock<IArtistaService> _artistaServiceMock;
private readonly ArtistaController _controller;
public ArtistaControllerTest(DataBaseFixture fixture)
{
_fixture = fixture;
_artistaServiceMock = new Mock<IArtistaService>();
_artistaServiceMock.Setup(service => service.GetAsync(It.IsAny<string>())).ReturnsAsync((string id) =>
{
var artista = _fixture.Context.Artista.FirstOrDefault(a => a.Id == id);
return new ArtistaForm { Id = artista.Id, Nome = artista.nome };
});
_controller = new ArtistaController(_artistaServiceMock.Object);
}
[Fact]
public async void GetArtista()
{
var artistaId = "1";
var expectedArtista = new ArtistaModel { Id = artistaId, nome = "Oda" };
var result = await _controller.Get(artistaId);
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var returnValue = Assert.IsType<ArtistaForm>(okResult.Value);
Assert.Equal(expectedArtista.Id, returnValue.Id);
Assert.Equal(expectedArtista.nome, returnValue.Nome);
}
}