项目
版本

Autofac FakeItEasy

Autofac.Extras.FakeItEasy 集成包允许你在单元测试中使用 Autofac 容器自动为具体和模拟的抽象实例创建假依赖项。

数组类型、IEnumerable<T> 类型和具体类型将通过底层容器创建,该容器已自动配置了 AnyConcreteTypeNotAlreadyRegisteredSource;而其他接口和抽象类将被创建为 FakeItEasy 模拟对象。

你可以在 NuGet 上获取 Autofac.Extras.FakeItEasy 包。

开始使用

假设你有一个要测试的系统及其依赖项:

public class SystemUnderTest
{
    public SystemUnderTest(IDependency dependency)
    {
    }
}

public interface IDependency
{
}

在编写单元测试时,使用 Autofac.Extras.FakeItEasy.AutoFake 类来实例化要测试的系统。这样会在构造函数中为你自动注入一个假依赖项。

[Test]
public void Test()
{
    using (var fake = new AutoFake())
    {
        // AutoFake类会注入一个假IDependency到SystemUnderTest的构造函数中
        var sut = fake.Resolve<SystemUnderTest>();
    }
}

配置模拟对象

你可以像平时使用 FakeItEasy 那样配置自动模拟对象,并/或对它们进行断言。

[Test]
public void Test()
{
    using (var fake = new AutoFake())
    {
        // 安排 - 配置模拟对象
        A.CallTo(() => fake.Resolve<IDependency>().GetValue()).Returns("expected value");
        var sut = fake.Resolve<SystemUnderTest>();

        // 行动
        var actual = sut.DoWork();

        // 断言 - 对模拟对象进行断言
        A.CallTo(() => fake.Resolve<IDependency>().GetValue()).MustHaveHappened();
        Assert.AreEqual("expected value", actual);
    }
}

public class SystemUnderTest
{
    private readonly IDependency dependency;

    public SystemUnderTest(IDependency strings)
    {
        this.dependency = strings;
    }

    public string DoWork()
    {
        return this.dependency.GetValue();
    }
}

public interface IDependency
{
    string GetValue();
}

配置特定依赖项

你可以配置 AutoFake 为给定服务类型的特定实例提供服务:

[Test]
public void Test()
{
    using (var fake = new AutoFake())
    {
        var dependency = new Dependency();
        fake.Provide(dependency);

        // ...以及测试的其余部分。
    }
}

你也可以为给定服务类型配置特定实现类型:

[Test]
public void Test()
{
    using (var fake = new AutoFake())
    {
        // 配置不需要构造参数的组件类型。
        fake.Provide<IDependency, Dependency>();

        // 配置需要一些构造参数的组件类型。使用Autofac参数列表。
        fake.Provide<IOtherDependency, OtherDependency>(
                new NamedParameter("id", "service-identifier"),
                new TypedParameter(typeof(Guid), Guid.NewGuid()));

        // ...以及测试的其余部分。
    }
}

模拟选项

你可以使用 AutoFake 的可选构造函数参数指定模拟对象的创建选项:

using(var fake = new AutoFake(
    // 使用严格行为创建模拟(未配置的调用抛出异常)
    strict: true,

    // 对抽象类型模拟的调用将调用抽象类型的基方法
    callsBaseMethods: true,

    // 提供在每个模拟创建后执行的操作
    onFakeCreated: f => { ... }))
{
    // 使用模拟/运行测试。
}

混合这些选项时要小心。指定 callsBaseMethods 与其他任何选项一起使用没有意义,因为它会覆盖它们。当同时指定 onFakeCreatedstrict 时,onFakeCreated 提供的配置将根据需要覆盖 strict

在本文档中