正如@Ruben Bartelink 在评论中指出的那样,possible。但是,我建议采用不同的方法,原因如下。
您通常希望使用 IoC 容器来管理对象的生命周期。然而,AutoFixture,即使它可能看起来像一个 IoC 容器,它确实是并不意味着成为一个 http://blog.ploeh.dk/2010/08/19/AutoFixtureasanauto-mockingcontainer/#comments:
AutoFixture 与 DI 容器有很多相似之处。它
支持自动装配,可以配置为在以下位置创建实例
很多有趣的方式。但由于侧重点不同,
有些事情做得更好,有些事情不如 DI 容器。
AutoFixture 的主要目标是让创建变得容易匿名测试数据 http://blogs.msdn.com/b/ploeh/archive/2008/11/17/anonymous-variables.aspx在一些可配置的范围内。它的API专注于允许程序员定制how测试数据已生成但未生成how long它会存在,因为它被认为只会被消耗在测试的背景下 http://blog.ploeh.dk/2010/08/19/AutoFixtureasanauto-mockingcontainer/#comments:
AutoFixture 在使用寿命方面较弱
管理。灯具的存在时间不会超过
单个测试用例,因此对任何其他生活方式进行建模是没有意义的
比短暂的 and 辛格尔顿。 [...]它没有
因为它不是 DI 容器。
另一方面,测试框架非常擅长管理测试装置的生命周期。由于您所描述的通常是管理的一部分context对于集成测试,我会运行它before and after执行夹具内的所有测试。
例如:
[TestFixture]
public class WithDatabaseContext
{
private string dbLocation;
private BaseDataContextFactory dataContextFactory
protected BaseDataContextFactory DataContextFactory
{
get { return this.dataContextFactory; }
}
[TestFixtureSetUp]
public void FixtureInit()
{
// Initialize dbLocation
// Initialize dataContextFactory
}
[TestFixtureTearDown]
public void FixtureDispose()
{
// Delete file at dbLocation
}
}
然后,您的测试可以继承上下文并使用它来配置 AutoFixture:
[TestFixture]
public void SomeTest : WithDatabaseContext
{
private IFixture fixture;
[SetUp]
public void Init()
{
this.fixture = new Fixture();
this.fixture.Register(
() => new ProjectRepository(base.DataContextFactory));
}
[Test]
public void Doing_something_should_return_something_else()
{
// ...
}
}
在这种情况下,利用测试框架来管理临时数据库的生命周期,可以在测试上下文中清楚地传达其边界。在我看来,将其隐藏在 AutoFixture 自定义中会使其不那么明显,并且可以说更难以使用。