1 介绍

之前的课程中碰到的功能都不涉及外部依赖,但是实际工作中,我们绝大部分的软件都是联网的,因此外部依赖必不可少。在我们进行单元测试时,需要将这些外部依赖分离出去。我们将会使用一个没有任何实现的文件类来代替原来的外部依赖,我们将这种文件类称为:测试替身(Test/Fake Double)

2 低耦合与可测试代码

许多遗留下来的老程序也许并没有进行过单元测试,如果我们想要对它进行改造,我们就需要将它重构成松耦合设计(loosely coupled design)。如果一个程序遵循松耦合设计,那么我们就可以在运行时替换对象。也就是说,在单元测试时,我们可以将原来的外部依赖替换为测试替身。

3 松耦合设计

  1. 将使用外部依赖的代码提取到另一个类中
  2. 将与外部依赖交互的代码提取出接口
  3. 在原类中调用接口

因为我们现在在原类中使用的是接口,我们就不能用 new 来生成对象了,而是选择从外部传入一个实现了接口的对象来进行调用,将对象从外部传入再调用的行为叫做依赖注入

4 通过形参进行依赖注入

我们可以直接将实现了接口的对象作为方法的参数值传入:

public string ReadVideoTitle(IFileReader fileReader)
{
    var str = fileReader.Read("video.txt");
    var video = JsonConvert.DeserializeObject<Video>(str);
    if (video == null)
        return "Error parsing the video.";
    return video.Title;
}

5 通过属性进行依赖注入