之前的课程中碰到的功能都不涉及外部依赖,但是实际工作中,我们绝大部分的软件都是联网的,因此外部依赖必不可少。在我们进行单元测试时,需要将这些外部依赖分离出去。我们将会使用一个没有任何实现的文件类来代替原来的外部依赖,我们将这种文件类称为:测试替身(Test/Fake Double)
许多遗留下来的老程序也许并没有进行过单元测试,如果我们想要对它进行改造,我们就需要将它重构成松耦合设计(loosely coupled design)。如果一个程序遵循松耦合设计,那么我们就可以在运行时替换对象。也就是说,在单元测试时,我们可以将原来的外部依赖替换为测试替身。
因为我们现在在原类中使用的是接口,我们就不能用 new 来生成对象了,而是选择从外部传入一个实现了接口的对象来进行调用,将对象从外部传入再调用的行为叫做依赖注入。
我们可以直接将实现了接口的对象作为方法的参数值传入:
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;
}