dotnet-cqrs/docs/tutorials/modular-solution/06-testing-strategy.md

1.7 KiB

Testing Strategy

Unit and integration testing for CQRS handlers.

Unit Testing Handlers

public class PlaceOrderCommandHandlerTests
{
    [Fact]
    public async Task Handle_ShouldCreateOrder()
    {
        // Arrange
        var repository = new Mock<IOrderRepository>();
        var handler = new PlaceOrderCommandHandler(repository.Object);

        var command = new PlaceOrderCommand
        {
            CustomerId = 1,
            Items = new List<OrderItemDto>
            {
                new() { ProductId = 1, ProductName = "Widget", Quantity = 2, Price = 10.00m }
            }
        };

        // Act
        var result = await handler.HandleAsync(command, CancellationToken.None);

        // Assert
        repository.Verify(r => r.AddAsync(It.IsAny<Order>(), It.IsAny<CancellationToken>()), Times.Once);
    }
}

Integration Testing

public class OrderApiTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly HttpClient _client;

    public OrderApiTests(WebApplicationFactory<Program> factory)
    {
        _client = factory.CreateClient();
    }

    [Fact]
    public async Task PlaceOrder_ShouldReturn201()
    {
        var command = new PlaceOrderCommand
        {
            CustomerId = 1,
            Items = new List<OrderItemDto>
            {
                new() { ProductId = 1, ProductName = "Widget", Quantity = 2, Price = 10.00m }
            }
        };

        var response = await _client.PostAsJsonAsync("/api/command/placeOrder", command);

        response.StatusCode.Should().Be(HttpStatusCode.Created);
    }
}

See Also