在.NET中是否有任何可以模拟系统时间的模拟库,无论哪个模拟库对我都好,比如moq等。
答案 0 :(得分:4)
像TypeMock Isolator或Microsoft 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);