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 全体をセットアップし、モック イベント ハンドラーを接続して、発行されたイベントを検証用に保存することもできますが、少しやり過ぎに思えます。
IRouteEvents
CommonDomain にはインターフェースがあります。イベントを直接取得するためにモックできるように見えますが、AggregateBase
実際にSubscriber
クラスに渡すにはどうすればよいでしょうか? ドミアンをテスト関連のコードで「汚染」したくありません。