我正在开发一个dotnet核心项目,试图在我的Xunit.net测试中模拟一些第三方类。我试图伪造的I类不能通过像Moq或NSubstitute这样的约束框架来模拟。所以我需要一个无约束的框架来做到这一点。
说我想在我的 .net核心测试项目中伪造DateTime.Now。
在.net 4.5中我们有 MSFakes (Moles),Smocks等。它们都没有支持dotnet核心框架。 Shim还没有移植到dotnet核心。
任何人都知道目前实现我的.NET Core目标的隔离框架或技术吗?
答案 0 :(得分:2)
您可以尝试不同的方式:使用您自己的接口和包装类包装这些第三方库。然后使用实现该接口的虚拟对象。
使用DateTime.Now等静态属性会变得更复杂。但它的工作方式类似:使用ITimeProvider
属性定义Now
接口。使用DateTimeWrapper : ITimeProvider
添加public DateTime Now => DateTime.Now;
,并且 - 为方便起见,但不是必需的 - 围绕它的静态类,例如
static class MyClock
{
static ITimeProvider _Instance;
static void SetInstanceForTesting(ITimeProvider instance)
{ _Instance = instance; }
static DateTime Now => _Instance.Now;
}
或者,您可以将ITimeProvider
实例注入需要它的对象。
答案 1 :(得分:1)
有点迟到的回复,但是对于其他任何寻求相同功能的人我都会推荐开源git项目prig:https://github.com/urasandesu/Prig它可以伪造静态方法(他们甚至有一个伪造和隔离DateTime的例子。现在,并且是Microsoft Fakes,TypeMock和JustMock的替代品(所有人都需要花钱或者需要使用最终版本的visual studio)。