Что внутри
| Тип | Назначение |
|---|---|
AggregateTestFixture<TAgg> | Fluent Given/When/Then для юнит-тестов агрегатов |
AggregateAssertions<TAgg> | Проверки доменных событий |
FakeRepository<TAgg, TId> | In-memory реализация IRepository<TAgg,TId> |
FakeIntegrationEventPublisher | Перехватывает опубликованные IIntegrationEvent |
ResultAssertions<T> | .Should().BeSuccess(), .BeFailure(), .BeFailureWith("code"), .HaveErrors("code1", "code2"), .HaveValue(x) |
Юнит-тесты агрегатов
public class OrderTests
{
[Fact]
public void Cancel_raises_OrderCancelled_event()
{
new AggregateTestFixture<Order>()
.Given(new OrderPlaced(orderId, customerId))
.When(o => o.Cancel("Customer request"))
.Then()
.ShouldHaveRaisedEvent<OrderCancelled>(e => e.Reason == "Customer request")
.And.ShouldHaveRaisedExactly(1);
}
}
Проверки Result
var result = order.Cancel("reason");
result.Should().BeSuccess();
result.Should().BeFailureWith("orders.order.already-cancelled");
result.Should().HaveErrors("general.value.is-required", "general.invalid-length"); // все коды, по порядку
result.Should().HaveValue(expectedValue);
Фейковая инфраструктура
var repo = new FakeRepository<Order, OrderId>();
var publisher = new FakeIntegrationEventPublisher();
// ... выполняем use case ...
repo.All.Should().ContainSingle();
publisher.GetPublishedEvent<OrderPlacedEvent>().OrderId.Should().Be(orderId);
IAggregateApply<TEvent> (опционально)
Реализуйте на своём агрегате, чтобы включить восстановление состояния в Given():
public class Order : AggregateRoot<OrderId>, IAggregateApply<OrderPlaced>
{
public void Apply(OrderPlaced e) => Status = OrderStatus.Pending;
}