【发布时间】:2020-10-27 18:26:09
【问题描述】:
我有一个使用 Jonathan Oliver 的 CommonDomain 和 EventStore 的小系统。
如何对聚合根进行单元测试以验证是否引发了正确的事件?
考虑以下聚合根:
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;
}
}
我想写一个如下测试:
// 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
我可以使用内存持久性和同步调度程序设置整个 EventStore,连接模拟事件处理程序并存储任何已发布的事件以供验证,但这似乎有点矫枉过正。
CommonDomain 中有一个接口IRouteEvents。看起来我可以模拟它以直接从 AggregateBase 获取事件,但我如何将它实际传递给我的 Subscriber 类?我不想用与测试相关的代码“污染”我的领域。
【问题讨论】:
-
可能值得测试更高级别(命令处理程序)。观看我的博客,了解关于这个主题的未来帖子(尽管不是特定于 CommonDomain)。
标签: unit-testing cqrs event-sourcing neventstore commondomain