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。现在
但您仍然可以传递参数进行测试。更改您电脑上的时间?这两个选项都不允许您自动运行测试,请不要这样做!另外@TejashwiKalpTaruDateTime
对象是不可变的,您不能更改它。我会使用不同的签名进行测试/调试。您也可以尝试使用虚拟时间从软件包安装软件包VirtualTime在您的pc上运行?这两个选项都不允许您自动运行测试,请不要这样做!另外@TejashwiKalpTaruDateTime
对象是不可变的,您不能更改它。我会使用不同的签名进行测试/调试,您也可以尝试使用软件包安装软件包VirtualTime中的虚拟时间