2012-04-08 118 views
2

我申请TDD给我的第一事件中心的项目(CQRS,事件采购等)和我TDD行为测试正在根据给定,何时,预计Greg Young的的简单测试框架写我的测试。我的测试夹具接受命令,命令处理程序和聚合根,然后测试输出的事件。没有getter/setter方法

CommandTestFixture<TCommand, TCommandHandler, TAggregateRoot> 

例如这里是一个典型的测试

[TestFixture] 
public class When_moving_a_group : 
    CommandTestFixture<MoveGroup, MoveGroupHandler, Foo> 

我很高兴与整体,但与上面的测试,我已经打了一个问题,这些测试。聚合根包含一组组。命令MoveGroup重新排列集合,从&索引。我设置了测试并声称使用正确的数据生成了正确的GroupMoved事件。

作为一个额外的测试,我需要断言组合集合的重新排序实际上正确发生了吗?当聚合根没有公共getter/setter时,我该如何做到这一点。我可以添加一个方法来检索特定索引的组,但是这不是简单的可破解封装吗?

这是怎么回事?

EDIT

的基团的重新排序发生在对总结根GroupMoved处理程序。

private void Apply(GroupMoved e) 
{ 
    var moved = groups[e.From]; 
    groups.RemoveAt(e.From); 
    groups.Insert(e.To, moved); 
} 

回答

1

这里的摩擦是因为你想断言一些关于内部实现的东西,但是你手头上的东西在顶层。

您的测试和断言需要处于相同的逻辑级别。有两种方法重新排列:

重新排序组对最高级别的后续命令或查询有什么影响?

这应该给你一个途径为断言正确的结果发生,而无需断言直接有关的群体的排序任何东西。这将测试保持在顶层,并允许各种内部重构(例如,可能是对组进行了惰性排序)。

你能在一个较低的水平测试?

如果你觉得上述过于复杂,测试,你可能想在一个更详细的级别帧测试。我认为这就像专注于一部分细节,以使其正确。

在此级别(而不是您的组合根)下,接口将知道组,并且您将有机会断言您想要声明的内容。

或者,你需要这个测试呢?

如果你不能找到上述任何级别的合适的测试,那么你肯定需要这个测试呢?如果没有明显的外部差异,则不需要通过测试来锁定行为。

+0

有趣。目前,排序对后续的命令没有影响,我可以看到。这仅仅是用户给予优先考虑的美学改变。我的更新,删除,编辑命令不会计划任何状态,我可以测试,所以我不能使用这些通道。重新进行低级测试时,AR上的句柄方法实际上是重新排序,但我仍然没有看到如何在当前实现中的较低级别上进行测试。 – madcapnmckay 2012-04-09 03:38:12

+0

@madcapnmckay如果该组未被重新排序,会在您的应用程序中破坏什么? – 2012-04-09 05:19:03

+0

目前我猜不出什么。我明白你在说什么,如果什么都没有中断,为什么我们需要一个测试。如果有什么东西要突破的话,我可以在休息时针对测试。 – madcapnmckay 2012-04-09 05:29:32