Testes Unitários Obrigatórios
Padronizamos a exigência de testes unitários para toda implementação, com foco em validar invariantes do domínio e a orquestração da Application de forma isolada e determinística.
Regra
- Toda implementação deve vir acompanhada de testes unitários.
- Regras de negócio no
Domaindevem ser testadas sem infra.
Exemplo (xUnit)
public sealed class MoneyTests
{
[Fact]
public void Should_create_money_with_positive_amount()
{
var m = Money.From(10m, "BRL");
Assert.Equal(10m, m.Amount);
Assert.Equal("BRL", m.Currency);
}
[Theory]
[InlineData(-1)]
[InlineData(-0.01)]
public void Should_throw_when_negative_amount(decimal amount)
{
Assert.Throws<DomainException>(() => Money.From(amount, "BRL"));
}
}
Exemplo de teste de Application (mockando repositório)
public sealed class PlaceOrderServiceTests
{
[Fact]
public async Task Should_place_order_and_commit()
{
var repo = Substitute.For<IOrderRepository>();
var uow = Substitute.For<IUnitOfWork>();
var logger = Substitute.For<ILogger<PlaceOrderService>>();
var sut = new PlaceOrderService(repo, uow, logger);
var cmd = new PlaceOrderCommand(Guid.NewGuid(), new[] { (Guid.NewGuid(), 1, 10m, "BRL") });
await sut.ExecuteAsync(cmd, CancellationToken.None);
await repo.Received(1).AddAsync(Arg.Any<Order>(), Arg.Any<CancellationToken>());
await uow.Received(1).CommitAsync(Arg.Any<CancellationToken>());
}
}