【发布时间】:2018-01-24 16:49:08
【问题描述】:
我的问题和这个类似:Should I mock all the dependencies when unit testing?
我了解当我的代码访问数据库或 Web 服务或文件系统上的文件时模拟的好处。嘲笑意味着如果有一个我无法控制的问题,例如网络问题,那么我的单元测试将通过 - 因为我的代码仍然正确。
但是,假设我有一些这样的代码:
public Offer AssignOffer(OfferType offerType, IOfferValueCalculator valueCalculator)
{
DateTime dateExpiring = offerType.CalculateExpirationDate();
int value = valueCalculator.CalculateValue(this, offerType);
var offer = new Offer(this, offerType, dateExpiring, value);
_assignedOffers.Add(offer);
NumberOfActiveOffers++;
return offer;
}
我从这里拿的:https://github.com/jbogard/presentations/blob/master/WickedDomainModels/After/Model/Member.cs
模拟传递给方法的对象参数,即 OfferType 和 IOfferValueCalculator(我编写的接口和类)是正常的做法吗?这些类是我编写的,与 Member.AssignOffer 在同一个项目中。
我之前问过一个类似的问题;但是它被关闭了,因为基于意见。我试图通过提供示例代码使这个问题更清楚。
我的问题也类似这样:When should I mock?。
这个:https://lostechies.com/jimmybogard/2011/01/07/putting-mocks-in-their-place/ 和这个:http://www.taimila.com/blog/ddd-and-testing-strategy/ 似乎只建议模拟:“模拟跨越架构上重要的边界,但不在这些边界内”。
【问题讨论】:
-
我怀疑它仍然非常基于意见,但也许仍然有价值。问题真的变成了,“这个测试验证了什么?”如果您不模拟输入,那么测试也至少在某种程度上验证所提供的对象。这些对象可能以某种方式失败,这将导致此测试失败,即使正在测试的特定方法没有失败。 (一个依赖项。)如果这是可以接受的,那么你不需要模拟。但是,如果您想要一种更纯粹的方法来仅测试此方法,建议使用模拟。
-
您寻求的答案的性质是基于意见的。嘲讽没有灵丹妙药。当人们谈论单元测试时,他们暗示单元是一个类,但你的单元真的是一个类吗?一个单元可以很容易地成为一个类树,其中只有聚合根很重要。如果没有父组件就没有目的,为什么要模拟它的组件?
-
@Justinas Marozas,我同意。您能否针对我的问题中的代码定制您的评论/答案?即你会模拟 OfferType 和 IOfferValueCalculator 吗?
标签: c# unit-testing mocking