CommonDomain - 如何对聚合根进行单元测试

Jak*_*cki 2 unit-testing cqrs event-sourcing event-store commondomain

我有一个使用Jonathan Oliver的CommonDomainEventStore的小系统.

我如何对我的聚合根进行单元测试以验证是否引发了正确的事件?

考虑遵循聚合根:

public class Subscriber : AggregateBase
{
        private Subscriber(Guid id)
        {
            this.Id = id;
        }

        private Subscriber(Guid id, string email, DateTimeOffset registeredDate)
            : this(id)
        {
            this.RaiseEvent(new NewSubscriberRegistered(this.Id, email, registeredDate));
        }

        public string Email{ get; private set; }
        public DateTimeOffset RegisteredDate { get; private set; }

        public static Subscriber Create(Guid id, string email, DateTimeOffset registeredDate)
        {
            return new Subscriber(id, email, registeredDate);
        }

        private void Apply(NewSubscriberRegistered @event)
        {
            this.Email = @event.Email;
            this.RegisteredDate = @event.RegisteredDate;
        }
}
Run Code Online (Sandbox Code Playgroud)

我想写下面的测试:

    // Arrange
    var id = Guid.NewGuid();
    var email = "test@thelightfull.com";
    var registeredDate = DateTimeOffset.Now;

    // Act
    var subscriber = Subscriber.Create(id, email, registeredDate);

    // Assert
    var eventsRaised = subscriber.GetEvents();  <---- How to get the events?
    // Assert that NewSubscriberRegistered event was raised with valid data
Run Code Online (Sandbox Code Playgroud)

我可以使用内存持久性和同步调度程序设置整个EventStore,挂起模拟事件处理程序并存储任何已发布的事件以进行验证,但它似乎有点过分.

IRouteEventsCommonDomain中有一个接口.看起来我可以嘲笑它直接从事件中获取事件,AggregateBase但我怎么能将它传递给我的Subscriber班级呢?我不想用测试相关代码"污染"我的多米安.

Jak*_*cki 7

我发现AggregateBase显式实现了IAggregate接口,它暴露了ICollection GetUncommittedEvents();方法.

所以单元测试看起来像这样:

var eventsRaised = ((IAggregate)subscriber).GetUncommittedEvents();

并且不需要依赖EventStore.