假设我们有一个Order类,带有一个名为Approve的方法。调用此方法时,它将检查某些条件,然后将Order置于Approved状态或引发异常。在服务层中,我们有如下内容:
var order = _repository.Single(o => o.ID == orderID);
order.Approve();
_context.SaveChanges(); // or _session.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
有2种方法可以测试此方法,我想听听您对此的见解:
解决方案1:对存储库进行存根以返回Order对象。然后断言订单处于“已批准”状态。
解决方案2:对存储库进行存根以返回模拟订单对象。断言已调用Approve()方法。
解决方案1更容易,我个人更喜欢基于状态的测试而不是基于交互的测试,因为后者可以针对实现细节,因此应避免使用。但是,我认为测试给定订单是否处于“批准”状态不是此服务方法的问题。我认为我们需要针对Order类的单独测试方法,以测试是否引发了异常或Order的状态已更改为Approved。
当我们将批准订单的职责委托给Order类本身时,解决方案2听起来很合逻辑。因此,对于此服务方法,我们可能需要进行2个测试:一个确保将批准订单的任务委派给Order类,另一个确保其保存更改。
您对此有何见解?您更喜欢哪种解决方案?
干杯
单元测试用于测试观察到的行为是否符合期望/规范。
在这种情况下,对问题的回答归结为您认为的“预期行为”:a)如果预期行为是调用服务方法后订单处于批准状态,则测试该状态;b)如果预期的行为是批准操作已委派,则测试方法调用。
在任何一种情况下,您都将需要测试Order对象的行为(以便调用Approve()将状态更改为“已批准”)。
第二种解决方案很好地发挥了作用,因为它解耦了两个对象的行为,但是,如果有多种方式可以使订单处于批准状态(这就是您要测试的情况–情况a)),则您可以限制接受不必要的行为。
另外,如果批准部分不是必需的,我将创建一个单独的测试来测试保存部分
| 归档时间: |
|
| 查看次数: |
1364 次 |
| 最近记录: |