【发布时间】:2019-09-20 03:51:32
【问题描述】:
我正在关注 TDD Kata 'Greeter',其中我必须使用一个方法创建一个类,该方法根据一天中被调用的时间返回不同的输出。所以我有这个类 Greeter
public class Greeter : Greeter
{
public DateTime time
{
get
{
return DateTime.Now;
}
}
public Greeter() { }
public string greet(string name)
{
string greeting = "Hello ";
name = name.Substring(0, 1).ToUpper() + name.Substring(1);
if(name.Length > 36)
{
name = name.Substring(0, 35);
}
if(time.Hour >= 6 && time.Hour <= 12)
{
greeting = "Good morning";
} else if (time.Hour >= 18 && time.Hour <= 22)
{
greeting = "Good evening";
} else if (time.Hour >=22 || time.Hour < 6)
{
greeting = "Good night";
}
return $"{greeting} {name}";
}
}
Greeter 实现IGreeter
public interface IGreeter
{
DateTime time
{
get;
}
string greet(string name);
}
现在在单元测试方面,我必须在一天中的不同时间进行测试才能看到响应:上午Good morning ~,晚上Good evening ~,晚上Good night ~,和Hello ~在默认情况下。
所以我的问题是,我如何在考虑这些时间限制的情况下设计这些单元测试而不对类进行太多修改?据我所知,更改类只是为了启用单元测试被认为是代码异味。有没有办法使用 NUnit 和 Moq 来实现这一点?到目前为止我看到的最好的解决方案是在构造函数中 DI 时间提供程序,但我宁愿不必在每个实例化中提供通用时间提供程序只是为了启用测试。
任何指导将不胜感激。
【问题讨论】:
-
这是一个骗局,但他们说答案不符合他们的要求
-
为什么 SO UI 不显示指向骗子的链接?我对这个 kata 也有同样的问题
-
只是为了记录,取决于时间称为时间耦合。例如,可以注入一个函数 Now() DateTime。现在我们可以在测试时提供一个具体的时间。参考:保持干燥,害羞,告诉其他人media.pragprog.com/articles/may_04_oo1.pdf