gpt4 book ai didi

unit-testing - 应用服务层 : Unit Tests, 集成测试,还是两者兼而有之?

转载 作者:行者123 更新时间:2023-12-03 21:23:02 29 4
gpt4 key购买 nike

我的应用程序服务层中有很多方法正在做这样的事情:

public void Execute(PlaceOrderOnHoldCommand command)
{
var order = _repository.Load(command.OrderId);
order.PlaceOnHold();
_repository.Save(order);
}

目前,我有一堆这样的单元测试:

[Test]
public void PlaceOrderOnHold_LoadsOrderFromRepository()
{
var repository = new Mock<IOrderRepository>();
const int orderId = 1;
var order = new Mock<IOrder>();
repository.Setup(r => r.Load(orderId)).Returns(order.Object);

var command = new PlaceOrderOnHoldCommand(orderId);
var service = new OrderService(repository.Object);
service.Execute(command);

repository.Verify(r => r.Load(It.Is<int>(x => x == orderId)), Times.Exactly(1));
}

[Test]
public void PlaceOrderOnHold_CallsPlaceOnHold()
{
/* blah blah */
}

[Test]
public void PlaceOrderOnHold_SavesOrderToRepository()
{
/* blah blah */
}

这些单元测试是否增加了值得付出努力的值(value),这似乎是有争议的。不过,我很确定应用程序服务层应该经过集成测试。

应用服务层应该测试到这个粒度级别,还是集成测试就足够了?

最佳答案

尽管还有集成测试,我还是会编写单元测试。但是,我可能会通过消除模拟框架,编写我自己的简单模拟,然后组合所有这些测试来检查模拟存储库中的订单是否被搁置,从而使测试变得更加简单。

[Test]
public void PlaceOrderOnHold_LoadsOrderFromRepository()
{
const int orderId = 1;
var repository = new MyMockRepository();
repository.save(new MyMockOrder(orderId));
var command = new PlaceOrderOnHoldCommand(orderId);
var service = new OrderService(repository);
service.Execute(command);
Assert.IsTrue(repository.getOrder(orderId).isOnHold());
}

真的没有必要检查以确保调用了加载和/或保存。相反,我只是确保 MyMockRepository 返回更新顺序的唯一方法是调用 load 和 save 。

这种简化是我通常不使用模拟框架的原因之一。在我看来,如果你编写自己的模拟,你可以更好地控制你的测试,并且更容易编写它们。

关于unit-testing - 应用服务层 : Unit Tests, 集成测试,还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672057/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com