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
与其他任何选项一起使用没有意义,因为它会覆盖它们。当同时指定 onFakeCreated
和 strict
时,onFakeCreated
提供的配置将根据需要覆盖 strict
。