C# 模拟日期时间 public void DoSomethingAccordingToYear() { 如果(DateTime.Now.Year

C# 模拟日期时间 public void DoSomethingAccordingToYear() { 如果(DateTime.Now.Year,c#,mocking,C#,Mocking,我想测试一下这个方法。 如何在不更改代码和不使用接口的情况下模拟DateTime?一种常见的方法是传入获取日期的组件。例如: public void DoSomethingAccordingToYear() { if(DateTime.Now.Year < 2010) DoSomething(); else DoSomethingElse(); } 现在,您可以将一个IDateTimeNowProvider注入到对象中并模拟它。一种常见的方

我想测试一下这个方法。
如何在不更改代码和不使用接口的情况下模拟DateTime

一种常见的方法是传入获取日期的组件。例如:

public void DoSomethingAccordingToYear()
{
    if(DateTime.Now.Year < 2010)
        DoSomething();
    else
        DoSomethingElse();
}

现在,您可以将一个
IDateTimeNowProvider
注入到对象中并模拟它。

一种常见的方法是传入一个获取日期的组件。例如:

public void DoSomethingAccordingToYear()
{
    if(DateTime.Now.Year < 2010)
        DoSomething();
    else
        DoSomethingElse();
}

现在,您可以将一个
IDateTimeNowProvider
注入到对象中并模拟它。

如果您更改方法的定义,它将很简单:

public interface IDateTimeNowProvider
{
    DateTime Now { get; }
}

public class DateTimeNowProvider : IDateTimeNowProvider
{
    public DateTime Now => DateTime.Now;
}
编辑

如果不想更改调用该方法的方式,也可以这样实现:

public void DoSomethingAccordingToYear(DateTime testDate)
{
    if(testDate.Year < 2010)
        DoSomething();
    else
        DoSomethingElse();
}
// production
DoSomethingAccordingToYear(DateTime.Now);

// test
DoSomethingAccordingToYear(new DateTime(2009,1,1));
public void DoSomethingAccordingToYear(DateTime?testDate=null)
{
testDate=testDate??DateTime.Now;
如果(testDate.Year<2010)
DoSomething();
其他的
DoSomethingElse();
}

如果您不使用参数调用它,那么它将使用
DateTime。现在
,但您仍然可以传递一个参数进行测试。

如果您更改方法的定义,它将很简单:

public interface IDateTimeNowProvider
{
    DateTime Now { get; }
}

public class DateTimeNowProvider : IDateTimeNowProvider
{
    public DateTime Now => DateTime.Now;
}
编辑

如果不想更改调用该方法的方式,也可以这样实现:

public void DoSomethingAccordingToYear(DateTime testDate)
{
    if(testDate.Year < 2010)
        DoSomething();
    else
        DoSomethingElse();
}
// production
DoSomethingAccordingToYear(DateTime.Now);

// test
DoSomethingAccordingToYear(new DateTime(2009,1,1));
public void DoSomethingAccordingToYear(DateTime?testDate=null)
{
testDate=testDate??DateTime.Now;
如果(testDate.Year<2010)
DoSomething();
其他的
DoSomethingElse();
}

如果您不使用参数调用它,那么它将使用
DateTime。现在
但您仍然可以传递参数进行测试。

更改您电脑上的时间?这两个选项都不允许您自动运行测试,请不要这样做!另外@TejashwiKalpTaru
DateTime
对象是不可变的,您不能更改它。我会使用不同的签名进行测试/调试。您也可以尝试使用虚拟时间从软件包安装软件包VirtualTime在您的pc上运行?这两个选项都不允许您自动运行测试,请不要这样做!另外@TejashwiKalpTaru
DateTime
对象是不可变的,您不能更改它。我会使用不同的签名进行测试/调试,您也可以尝试使用软件包安装软件包VirtualTime中的虚拟时间