我开始深入了解应用服务层的集成测试。某些测试需要执行多个操作才能设置测试,例如
[TestFixture]
public class IntegrationTests
{
[Test]
public void CreateOrder()
{
new OrderService().Execute(new CreateOrderCommand());
// check some assertions on a retrieved viewmodel
}
[Test]
public void AddItemToOrder()
{
var service = new OrderService();
var orderId = service.Execute(new CreateOrderCommand());
service.Execute(new AddItemToOrderCommand(orderId, "itemcode"));
// check some assertions on the viewmodel
}
[Test]
public void SubmitOrder()
{
var service = new OrderService();
var orderId = service.Execute(new CreateOrderCommand());
service.Execute(new AddItemToOrderCommand(orderId, "itemcode"));
service.Execute(new SubmitOrderCommand(orderId));
// check some assertions on the viewmodel
}
}
因此,在上面的例子中,每个集成测试都会逐渐变得越来越长,并且在订单的生命周期中还有更多的事情需要发生,因此我担心这种方法的可维护性。另外,我可以想到在我的域对象处于我需要的状态之前需要执行7个命令的测试才能执行我真正感兴趣的测试命令。
另一种方法是直接在我想要的状态下实例化域对象,例如:
new Order(OrderStatus.Unsubmitted, new OrderItem("itemcode"))
这种方法的问题是我的域对象实现不是公共的(只是接口),所以我需要允许我的集成测试程序集来查看我的域程序集的内部。我不确定这种方法是否会破坏集成测试的目的,因为我没有通过应用服务层执行所有预备步骤。
我应该采取什么方法来确保我的集成测试在保持可维护性的同时执行其有价值的功能?