2015-11-04 47 views
0

考虑下面的代码(在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实现所做的事情。

T Copy<T>(T source); 

作为这种情况下模拟设置急剧简化为:如果我可以改变Copy方法以下

问题被简化。问题是有Model对象的视图绑定,我不能简单地销毁和重新创建对象。

有没有一种优雅的方式来解决这个问题?

回答

0

如果您使用的是mock,那么您唯一关心的是使用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

+0

之间的区别当然!我有点生疏。我应该只关心复印机是否被调用。谢谢。 – Hawk