我正在开发一个 dotnet 核心项目,试图在我的 Xunit.net 测试中模拟一些第三方类。我试图伪造的类不能通过 Moq 或 NSubstitute 等受限框架进行模拟。所以我需要一个不受约束的框架来做到这一点。
假设我想在我的 .net core 测试项目中伪造 DateTime.Now 。
在.net 4.5中,我们有MSFakes(Moles)、Smocks等。它们都不支持dotnet核心框架。 Shim 尚未移植到 dotnet core。
有人知道任何隔离框架或技术可以实现我目前的 .NET Core 目标吗?
您可以尝试不同的方法:用您自己的接口和包装类包装这些第三方库。然后使用实现该接口的虚拟对象。
像 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
实例注入到需要它的对象中。
回复有点晚了,但对于其他寻求同类功能的人来说,我会推荐开源 git 项目 prig: https://github.com/urasandesu/Prig 它可以伪造静态方法(它们甚至有一个伪造和隔离 DateTime.Now 的示例),并且是 Microsoft Fakes、TypeMock 和 JustMock(所有需要花钱或需要 Visual Studio 终极版才能使用的人)的替代品。
姿势是一个选项。内存已满,免费 https://GitHub.com/tonerdo/pose
如果您正在寻找一个免费且功能强大的 dotnet core 单元测试框架,我找不到满足我需求的项目。我自己创建了一个。请放心使用: