如何对使用依赖项复制对象的方法进行单元测试?

时间:2015-11-04 22:10:54

标签: unit-testing

考虑以下代码(在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对象的视图绑定,我不能简单地销毁和重新创建对象。

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

1 个答案:

答案 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

之间的区别