gpt4 book ai didi

c# - 为什么不直接使用 DateTime.Now?

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:41 24 4
gpt4 key购买 nike

我最近一直在努力学习接口(interface)。

我看到了这段代码,无法理解为什么您不单独使用 DateTime.Now。我不确定为什么界面有用,有人可以解释一下吗?这本书的作者试图解释,但我真的不明白如何按照他们所说的方式实现它:

Has the programmer lost himself in a sea of abstraction? You might be tempted to think so, but actually this is pretty smart. Imagine you have to run some tests on a class that gives different results dependent on the current time (or date). That’s not uncommon at all; maybe it’s a financial application that needs to get the exchange rate at a given date. So try testing that if the codebase has DateTime.Now directly in the methods. With the INowResolver you can inject your now and test for yesterday, now, and tomorrow

public interface INowResolver { DateTime GetNow(); } 

public class NowResolver : INowResolver {
public DateTime GetNow() {
return DateTime.Now;
}
}

当我测试它时,如果我使用 NowResolver.GetNow 方法或只使用 DateTime.Now,结果是一样的。

测试:

        NowResolver now = new NowResolver();
Console.WriteLine(now.GetNow());
Console.WriteLine(DateTime.Now);
System.Threading.Thread.Sleep(1000);
Console.WriteLine(now.GetNow());
Console.WriteLine(DateTime.Now);

输出:

07/02/2019 15:14:56
07/02/2019 15:14:56
07/02/2019 15:14:57
07/02/2019 15:14:57

最佳答案

编写单元测试时,重要的是每次运行时测试都以完全相同的方式执行。

如果您的测试(或正在测试的代码)使用DateTime.Now(或DateTime.UtcNow),那么每次运行时您都会得到不同的测试结果(假设您正在测试包含上述 DateTime 的属性)。

如果将 DateTime 抽象到一个接口(interface)中,您可以在测试运行时,在调用 INowResolver.Now 时返回相同的时间。

示例:在此测试中,时间始终为 2018 年 1 月 1 日。

public class MyTest
{
public class TestNow : INowResolver
{
public DateTime Now {get;set;}
public DateTime GetNow() => Now;
}

[Test]
public void MyTest()
{
var resolver = new TestNow { Now = new DateTime(2018,1,1) }

var testClass = new TestClass(resolver);

}
}

实际上,如果我在所有情况下都使用过此方法,Now 是一个属性,就像在 DateTime.Now 中一样,而不是函数。

关于c# - 为什么不直接使用 DateTime.Now?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54576524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com