我正在将 TDD 应用于我的第一个以事件为中心的项目(CQRS、事件溯源等),并且我正在根据 Greg Young 的简单测试框架 Given、When、Expect 编写测试。我的测试夹具接受一个命令、命令处理程序和聚合根,然后测试输出的事件。
CommandTestFixture<TCommand, TCommandHandler, TAggregateRoot>
例如这里是一个典型的测试
[TestFixture]
public class When_moving_a_group :
CommandTestFixture<MoveGroup, MoveGroupHandler, Foo>
总的来说,我对这些测试非常满意,但是在上面的测试中我遇到了问题。聚合根包含一组组。该命令MoveGroup
对集合进行重新排序,采用 from & to 索引。我设置了测试并断言GroupMoved
使用正确的数据生成了正确的事件。
作为一项附加测试,我需要断言 Groups 集合的重新排序实际上是正确进行的?当聚合根没有公共 getter/setter 时,我该怎么做。我可以添加一种方法来检索特定索引处的组,但这种破坏性封装不是只是为了可测试吗?
这样做的正确方法是什么?
编辑
组的重新排序发生在 Aggregate 根上的 GroupMoved 处理程序中。
private void Apply(GroupMoved e)
{
var moved = groups[e.From];
groups.RemoveAt(e.From);
groups.Insert(e.To, moved);
}