【发布时间】:2013-12-20 19:57:35
【问题描述】:
我有一个域模型,它有一个 OccurredOn 字段,应该初始化为当前日期。通常我会在构造函数中将它设置为 DateTime.Now。
现在我正在尝试创建一个IClock 接口,以便我可以模拟DateTime.Now 进行单元测试。但是,现在我会将IClock 依赖项注入到我的域模型中吗?我应该手动将实例化的Clock 实例传递给构造函数吗?我应该使用我的 DI 容器来解决构造函数中的依赖关系吗?我应该创建一个工厂类来给我一个初始化的对象吗?我离基地很远吗?
为此:
public class LogItem : KeyedEntityBase
{
public LogItem(string message, string description, string status)
: this()
{
Message = message;
Description = description;
Status = status;
}
private LogItem() { }
public DateTime OccurredOn { get; set; }
public string Message { get; set; }
public string Description { get; set; }
public string Status { get; set; }
}
这个:
var newItem = new LogItem("message", "desc", "status", new Clock());
或者这个:
var newItem = LogItemFactory.CreateNewLogItem("message", "desc", "status");
或者这个:
public LogItem(string message, string description, string status)
: this()
{
Message = message;
Description = description;
Status = status;
var clock = ObjectFactory.GetInstance<IClock>();
OccurredOn = clock.Now();
}
【问题讨论】:
-
为什么不直接使用 Moles (research.microsoft.com/en-us/projects/moles) 而你可以忘记那个界面?
-
刚刚检查过,不,据我所知,它不在 nuget 上。自己没试过,不过好像得安装一下。
-
嘘。我目前正在查看它,它似乎工作正常:ayende.com/blog/3408/dealing-with-time-in-tests
-
是的,这也可以,而且没有界面可以摆弄。 :)
标签: c# unit-testing dependency-injection mocking