Integration Tests - artemovsergey/ASP GitHub Wiki
Testcontainers
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Testcontainers.PostgreSql;
using Xunit;
public class GameRepositoryIntegrationTests : IAsyncLifetime
{
private readonly PostgreSqlContainer _postgreSqlContainer;
private TicTacToeContext? _dbContext;
private GameAsyncRepository? _repository;
private Mock<ILogger<GameAsyncRepository>> _loggerMock;
public GameRepositoryIntegrationTests()
{
_postgreSqlContainer = new PostgreSqlBuilder()
.WithImage("postgres:latest")
.WithDatabase("testdb")
.WithUsername("postgres")
.WithPassword("postgres")
.Build();
_loggerMock = new Mock<ILogger<GameAsyncRepository>>();
}
public async Task InitializeAsync()
{
await _postgreSqlContainer.StartAsync();
var options = new DbContextOptionsBuilder<TicTacToeContext>()
.UseNpgsql(_postgreSqlContainer.GetConnectionString())
.Options;
_dbContext = new TicTacToeContext(options);
await _dbContext.Database.EnsureCreatedAsync();
// Заполняем тестовыми данными
for (int i = 0; i < 4; i++)
{
var game = new Game
{
Id = Guid.NewGuid(),
Status = StatusGame.Active,
Board = new string?[][]
{
},
Result = ResultGame.None,
CreatedAt = default,
CurrentMove = Player.X,
CurrentStep = 0
};
_dbContext.Games.Add(game);
}
await _dbContext.SaveChangesAsync();
_repository = new GameAsyncRepository(_dbContext, _loggerMock.Object);
}
public async Task DisposeAsync()
{
await _dbContext!.DisposeAsync();
await _postgreSqlContainer.DisposeAsync();
}
[Fact]
public async Task GetGamesAsync_ShouldReturn5GamesFromDatabase()
{
// Act
var games = await _repository!.GetGamesAsync(CancellationToken.None);
// Assert
Assert.Equal(5, games.Count());
}
}