有像TypeMock Isolator或Microsoft 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)
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |