# 零、简介

这本书是关于 FakeItEasy 的，一个由[Patrik hagne](https://github.com/patrik-hagne)编写的开源嘲讽框架。FakeItEasy 用于在单元测试时嘲讽依赖关系。

也许你用过其他的嘲讽框架，你在想是什么让 FakeItEasy 与众不同。或者，您以前从未使用过嘲讽框架，但您一直在编写“桩”类，这些类为您的单元测试实现接口，您有兴趣了解嘲讽框架如何提供帮助。

FakeItEasy 区别于其他嘲讽框架的地方在于它更容易使用。事实上，有些人甚至不用“模拟”这个词来描述框架——他们说这是一个“伪造”的框架。流畅的界面与易于理解的应用编程接口相结合，使其成为单元测试中使用的最快的模拟框架。

这本书假设读者熟悉 IoC(控制反转)、DI(依赖注入)和单元测试(使用 NUnit)等概念。如果没有对这些概念的基本理解，这本书的其余部分可能没有多大意义。理解微软的 MVC 框架是从第 10 章“MVC 和 FakeItEasy”中获得最大收益的必要条件理解 C#委托(Action <t>和 Func <t>)被推荐用来理解 FakeItEasy 的一些 API，但并不是从这本书中获得价值所必需的。</t></t>

这本书还假设读者不知道也没有使用过 FakeItEasy，但对 FakeItEasy 如何提高生产率和减少单元测试期间编写的代码浪费感兴趣。

我说的浪费代码是什么意思？

你是否曾经为了测试的明确目的而必须对一个带有依赖关系的类进行单元测试，并且必须编写一个实现该接口的类来“排除”行为？如果您已经这样做了，您就知道这些“被剔除”的类代表了大量的“废弃”代码。它们还代表了重构桩类正在实现的接口时的摩擦，因为除了更改实现接口的真实类的实现之外，现在还有一堆“桩”类也需要更新。

如果你对上一段中的任何一项回答“是”，那么 FakeItEasy 就是你的嘲讽框架。您将学会在单元测试中使用 FakeItEasy，而不需要编写那些浪费时间、扔掉的桩类。

对于那些看完这本书有兴趣从 Moq(另一个流行的开源嘲讽框架)迁移到 fakeitesy 的人，我强烈推荐 Daniel Marbach 的[博文](http://www.planetgeek.ch/2013/07/18/migration-from-moq-to-fakeiteasy-with-resharper-search-patterns/)，里面谈到了用 ReSharper Search Patterns 从 MOQ 迁移到 fakeitesy。

本书中的所有示例都使用 NUnit 作为测试框架。如果你不熟悉 NUnit，或者一般的单元测试，我会推荐马克·克利夫顿的 [*单元测试简洁地*](http://www.syncfusion.com/resources/techportal/ebooks/unittesting) 。

希望在这本书的最后，您将对如何在您的单元测试中使用 FakeItEasy 有一个坚实的理解，在设置、配置和断言过程中满足您所有的测试需求。

## 本书使用的惯例

### SUT

我们将在单元测试的背景下探索 FakeItEasy。当我设置单元测试时，总会有一个被测主题(SUT)，这是我正在测试的类，它带有一个我用 FakeItEasy 假装的依赖。

例如，给定这个接口:

```cs
    public interface IDoSomething
    {
        string DoIt();
    }

```

代码清单 1:接口

如果我想测试这门课:

```cs
    public class ClassToBeTested
    {
        private readonly IDoSomething doSomething;

        public ClassToBeTested(IDoSomething doSomething)
        {
            this.doSomething = doSomething;
        }

        public string GoAheadAndDoIt()
        {
            return doSomething.DoIt();
        }s
    }

```

代码清单 2:待测试类

单元测试的设置可能如下所示:

```cs
    [TestFixture]
    public class WhenTheClassToBeTestedIsDoingSomething
    {
        [SetUp]
        public void Given()
        {
            var sut = new ClassToBeTested(A.Fake<IDoSomething>());
        }
    }

```

代码清单 3:使用 SUT 来表示测试中的主题

SUT 代表受试者，在这种情况下是`ClassToBeTested`类。

### “给定”始终是[SetUp]方法的名称

在我的单元测试中，我将始终用名为`Given`的方法表示测试的设置，该方法将由`[SetUp]`修饰。

### “新”或“新”

在本书中，我将使用术语“新的”或“新的”这意味着创建一个事物的实例。这种用法的一个例子是“我们将更新客户类。”

## 源代码

这本书的源代码可以从我的 [GitHub 账号](https://github.com/mgmccarthy)下载找到。虽然下载这本书并不是理解这本书的必要条件，但它可以让你运行/调试单元测试，从而提供更深刻的见解。

## 关于文本的一点注记

我要特别感谢 FakeItEasy 团队的成员 Blair Conrad，他对完成文本的反馈对这本书的最后润色是无价的。布莱尔在有混淆的地方提供了清晰度，在需要修正的地方提供了技术编辑，在技术解释的基础上提供了一般语法和句子结构建议。

你可以在 http://blairconrad.com/看他的博客，在 blair@blairconrad.com 直接联系他。

谢谢布莱尔！