假设我们有一个Order类,其中包含一个名为Approve的方法。调用此方法时,它会检查某些条件并将 Order 置于 Approved 状态或引发异常。在服务层,我们有这样的东西:
var order = _repository.Single(o => o.ID == orderID);
order.Approve();
_context.SaveChanges(); // or _session.SaveChanges();
有两种方法可以测试此方法,我想听听您对此的见解:
解决方案 1:存根存储库以返回 Order 对象。然后断言订单处于“已批准”状态。
解决方案 2:存根存储库以返回模拟订单对象。断言 Approve() 方法被调用。
解决方案 1 更简单,我个人更喜欢基于状态的测试而不是基于交互的测试,因为后者可以针对实现细节并且应该避免。但是,我相信测试给定订单是否处于已批准状态不是此服务方法的关注点。我认为我们需要一个单独的 Order 类测试方法来测试是否抛出异常或 Order 的状态是否更改为 Approved。
解决方案 2 可能听起来合乎逻辑,因为我们将批准订单的责任委托给订单类本身。所以也许我们需要对这个服务方法进行 2 个测试:一个确保它将批准订单的任务委托给 Order 类,另一个确保它保存更改。
您对此有何见解?您更喜欢哪种解决方案?
干杯