![]() |
1
15
这是一个依赖关系,并且是一个不确定的依赖关系。您需要将代码的责任划分得多一点。 之前:
后:
这两组代码不应该相互依赖。 这种分离依赖关系的模式也适用于其他情况(数据库、文件系统等)。 |
![]() |
2
12
使用DI来注入“当前日期和时间”无疑是一种过度杀伤力。我宁愿重构代码以在任意日期运行。也就是说,我会改变的
|
![]() |
3
10
我使用了OrenEini(又名AyendeRhien)在他的博客中讨论的非常实用的方法。 Dealing with time in tests . 有一个这样的静态类:
你的代码变成:
你的测试将变成:
|
![]() |
4
9
始终将核心日期处理逻辑(在我的经验中,这通常很容易为此而隔离)放在以日期为参数的单独方法中。 然后,在您的生产代码中,您可以调用这些代码,并将当前日期作为参数提供给它们,并且仍然可以在单元测试中对边缘案例进行测试。 顺便说一句,我发现非常关键的是要测试边缘案例的日期逻辑。它消除了(可能是灾难性的,参考文献Zune)你从来没有发现过的错误。除了你提到的那些,夏令时开关也可能是有问题的。 |
![]() |
5
3
你可以制作一个模拟日期时间的mockobject。 下面是一篇文章,其中有一个示例,其中datetime.now正在被模拟: http://geekswithblogs.net/AzamSharp/archive/2008/04/27/121695.aspx |
![]() |
6
3
你已经给出了答案。可以围绕datetime函数编写一个小的包装类,然后将该类注入需要获取当前日期的类中。将datetime.now替换为对包装对象的调用。 在测试中,您可以注入一个存根或模拟对象,为您提供所需的日期。 另一种解决方案可能是,根据代码的工作方式,将日期作为参数传递,而不是隐藏对日期时间的调用。这使得您的代码更加可重用,因为它可以在超过当前日期的情况下工作。 |
![]() |
7
2
|
![]() |
8
1
为什么不使用假货?使用Visual Studio尽可能简单。只需在系统中添加一个假程序集,在测试中添加ShimsContext,
并设置日期时间。现在返回特定值:
这种方法可以确保对datetime的每次调用。现在都被重定向到代码,因此您不必注入任何东西来获取当前时间(这应该是非常直接的),也不需要一个全局的、可写的变量。 |
![]() |
9
0
依赖注入可以解决这个问题,是的。 您将要做的是创建一个IDateTimeProvider接口,该接口带有一个方法:getDate()。在生产代码类中,您将实现返回日期时间。 当单元测试时,如Natrium建议的那样,您可以用一个模拟对象来替换它,该对象返回一个特定的测试日期。 |
![]() |
SkarabePL · Yii2依赖注入、配置和继承 7 年前 |