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

时间:2017-03-12 23:10:57

标签: c# .net moq

在.NET中是否有任何可以模拟系统时间的模拟库,无论哪个模拟库对我都好,比如moq等。

1 个答案:

答案 0 :(得分:4)

TypeMock IsolatorMicrosoft Fakes这样的工具可以模仿像DateTime.Now这样的东西,但它们不是免费的(对于TypeMock Isolator,你至少需要“Essential”版本,以及对于MS Fakes,您需要Visual Studio Enterprise。

但是,你真的不需要那样做。您可以在其上创建抽象,而不是模拟DateTime.Now,并且可以模拟抽象。像这样:

public interface ITimeService
{
    DateTime Now { get; }
}

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

public class MyClass
{
    private readonly ITimeService _timeService;

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

    public int GetCurrentYear()
    {
        return _timeService.Now.Year;
    }
}

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);