.NET 中是否有任何可以模拟系统时间的模拟库?

Ada*_*Lee -4 .net c# moq

.NET 中是否有任何可以模拟系统时间的模拟库,无论哪个模拟库对我来说都可以,例如 moq 等?

Tho*_*que 5

有像TypeMock IsolatorMicrosoft Fakes这样的工具可以模拟诸如DateTime.Now.

但是,您并不真正需要它。DateTime.Now您可以在其上创建一个抽象,而不是 mocking ,并且可以模拟该抽象。像这样的东西:

public interface ITimeService
{
    DateTime Now { get; }
}
Run Code Online (Sandbox Code Playgroud)

不要DateTime.Now直接在你的代码中使用,而是注入一个实例ITimeService

public class MyClass
{
    private readonly ITimeService _timeService;

    public MyClass(ITimeService timeService)
    {
         _timeService = timeService;
    }

    public int GetCurrentYear()
    {
        return _timeService.Now.Year;
    }
}
Run Code Online (Sandbox Code Playgroud)

的“真正”实现ITimeService只会返回DateTime.Now. 在您的单元测试中,您可以使用任何模拟框架(FakeItEasy、Moq、NSubstitute...)来制作您控制的模拟时间服务。例如,使用 FakeItEasy:

// Arrange
var timeService = A.Fake<ITimeService>();
A.CallTo(() => timeService.Now).Returns(new DateTime(1969, 7, 21));
var myClass = new MyClass(timeService);

// Act
var year = myClass.GetCurrentYear();

// Assert
year.Should().Be(1969);
Run Code Online (Sandbox Code Playgroud)