考虑以下代码(在C#中,但它可以是任何其他语言):
public interface IObjectCopier
{
void Copy<T>(T source, T target);
}
public class Model
{
public string Name { get; set; }
}
public class ViewModel
{
private readonly IObjectCopier _objectCopier;
public ViewModel(IObjectCopier objectCopier)
{
_objectCopier = objectCopier;
}
public Model ViewBindData { get; set; }
public void Load(Model model)
{
_objectCopier.Copy(model, ViewBindData);
}
}
如何为Load方法构建单元测试?如果我模拟IObjectCopier,那么我需要提供Copy方法的模拟实现。在这个例子中,它是微不足道的,但在现实世界中,模型可能很大,子模型和模拟练习感觉它只是复制IObjectCopier实现的功能。
如果我可以将Copy方法更改为以下内容,问题就会简化:
T Copy<T>(T source);
在这种情况下,模拟设置大大简化。问题是有对Model对象的视图绑定,我不能简单地销毁和重新创建对象。
有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:0)
如果您正在使用模拟,那么您唯一关心的是使用2个参数调用复印机。
所以在某种伪代码中
test "populates model from view data" {
objectCopiermock = mock(IObjectCopier)
model = new Model() //create empty or use a TestDataBuilder
viewBindData = new viewBindData() //create empty or use a TestDataBuilder
viewModel = new ViewModel(objectCopiermock)
viewModel.viewBindData(viewBindData)
viewModel.Load(model)
verifyMock(objectCopiermock).copy(model, viewBindData)
}
模拟的重要一点是验证交互,而不是模型或viewBindData中的值。
如果这很困惑,不要惊慌! (tm) - 我建议你先阅读London and Chicaco/Detroit schools of TDD
之间的区别