作为我关于.NET模拟框架及其工作方式的博客系列的伴侣,此存储库尝试使用每个可用的.NET可用的主要模拟框架来通过模拟实现相同的单元测试。
该项目旨在作为希望比较.NET模拟框架或有关给定框架的语法示例的任何人的参考。这并不是要详尽的参考,而不是无障碍(但是如果您发现任何问题,请告诉我)。
为了编写测试,我们需要一些需要测试的代码。因此,我已经创建了LunchNotifier ,这是一个稍有少量的班级课程,可以用该课程编写单位测试(带有模拟)。
在纽约办公室工作的堆叠溢出的股东提供的好处之一是内部厨师的免费午餐。每天,当厨师完成准备餐点时,向办公室的员工发出了通知,让他们知道可以使用食物。
在CodeBeingTested项目中, LunchNotifier类是我们的主要目标。
该课程具有五个外部依赖关系,需要嘲笑以执行我们的测试:
INotificationService (通过构造器注入)ILogger (通过构造函数注入)IEmployeeService (通过构造函数注入)IEmployee对象)IEmployee (从IEmployeeService返回)System.DateTime主要逻辑是在LunchNotifier.SendLunchtimeNotifications()中。此方法包括对System.DateTime.Now内联呼叫。dateTime.now,该呼叫无法通过诸如MOQ或Rhinomocks(例如:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
提供了替代实现,以在LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() ,其中调用DateTime.Now已将其提取到其自己的方法中,可以用一个模拟替换:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
其余的每个项目都试图使用不同的模拟框架对LunchNotifier实施类似的单元测试。
所有测试均使用Nuget软件包使用Nunit v3.10编写。
在某些情况下,有多种方法可以使用模拟框架进行测试,因此我提供了测试的多种变体来展示不同的方法。
该测试创建了一个模拟员工“鲍勃”,他更喜欢电子邮件通知,并使用模拟来确保LunchNotifier逻辑在午餐准备就绪时向他发送电子邮件。
该测试创建了两个模拟员工,“鲍勃”和“玛莎”,并确保如果向其中一个发送通知会导致登录错误,并且不会阻止其余员工获得通知。
该测试使用Nunit的TestCase语法运行两个测试用例,一个在下午1点之前,另一个在下午1点以后,以确保根据一天中的时间使用适当的通知模板。
对于不受约束的框架, DateTime.Now可以直接控制DateTime以返回测试的输入时间,但是,受约束的框架不能,因此他们必须将调用拨打到DateTime.Now现在,将其提取到Sperate方法中,然后修改该新方法的行为。因此,需要SendLunchtimeNotifications_DateTimeSeam变体。
类型:受约束
项目:https://github.com/moq/moq4/wiki/quickstart
nuget:https://www.nuget.org/packages/moq/
类型:受约束
项目:https://github.com/hibernating-rhinos/rhino-mocks
nuget:https://www.nuget.org/packages/rhinomocks
警告: Rhinomocks实际上是一个死亡的项目,可能不会为.NET(例如.NET Core)的未来变化提供支持。如果您尚未使用此框架,我不建议您开始使用此框架。
要运行这些测试,您必须安装VS2017 Enterprise(或Equiv)。
类型:受约束
项目:http://nsubstitute.github.io/
Nuget:https://www.nuget.org/packages/nsubstitute
类型:不受限制
Microsoft假货是Visual Studio 2017 Enterprise或Visual Studio 2015 Ultimate的一部分,并且不作为Spere Compontime。
假货不在本地支持AssertWasCalled样式验证,因此我使用额外的Nuget软件包(我为此做出了贡献)来提供该功能:fakes.contrib / nuget
类型:不受限制
产品信息:https://www.typemock.com/isolator
该产品需要付费许可证(有15天的免费试用版)才能进行无限制的嘲笑。 Typemock足够好,可以为我提供免费的社区许可证,以便我可以从事这样的项目。