如何在应用服务层上设置集成测试:通过服务层命令或直接使用域?

时间:2011-07-29 14:43:28

标签: domain-driven-design integration-testing

我开始深入了解应用服务层的集成测试。某些测试需要执行多个操作才能设置测试,例如

[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"))

这种方法的问题是我的域对象实现不是公共的(只是接口),所以我需要允许我的集成测试程序集来查看我的域程序集的内部。我不确定这种方法是否会破坏集成测试的目的,因为我没有通过应用服务层执行所有预备步骤。

我应该采取什么方法来确保我的集成测试在保持可​​维护性的同时执行其有价值的功能?

0 个答案:

没有答案