Khi @Ruben Bartelink chỉ ra trong các nhận xét, đó là có thể. Tuy nhiên, tôi muốn giới thiệu một cách tiếp cận khác và đây là lý do tại sao.
Quản lý tuổi thọ của các đối tượng là điều bạn thường mong đợi để có thể thực hiện với vùng chứa IoC. AutoFixture Tuy nhiên, mặc dù nó có thể trông giống như một container IoC, nó thực sự not meant to be one:
AutoFixture chia sẻ rất nhiều điểm tương đồng với DI Containers. Nó hỗ trợ tự động-dây và nó có thể được cấu hình để tạo ra các trường hợp trong nhiều cách thú vị. Tuy nhiên, vì trọng tâm là khác nhau, nó làm một số điều tốt hơn và một số điều không phải cũng như một DI Container.
Mục tiêu chính của AutoFixture là giúp dễ dàng tạo anonymous test data trong một số giới hạn có thể định cấu hình. API của nó là tập trung vào việc cho phép các lập trình viên để tùy chỉnh cách dữ liệu thử nghiệm được tạo ra nhưng không bao lâu nó sẽ sống, vì nó giả định chỉ được tiêu thụ within the context of a test:
AutoFixture là yếu khi nói đến quản lý cuộc đời . Lịch thi đấu không bao giờ được mong đợi tồn tại trên một trường hợp thử nghiệm đơn lẻ , do đó, không có ý nghĩa gì khi mô hình hóa bất kỳ lối sống nào khác hơn Tạm thời và Singleton. [...] Nó không có , bởi vì nó không phải là DI Container.
Các khung kiểm tra, mặt khác, khá giỏi trong việc quản lý tuổi thọ của đồ đạc thử nghiệm. Vì những gì bạn mô tả thường là một phần của việc quản lý ngữ cảnh cho thử nghiệm tích hợp, tôi sẽ chạy nó trước và sau khi tất cả các thử nghiệm trong lịch thi đấu được thực thi.
Ví dụ:
[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
}
}
thử nghiệm của bạn sau đó có thể thừa hưởng bối cảnh và sử dụng nó để cấu hình 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()
{
// ...
}
}
Trong trường hợp này, tận dụng khuôn khổ kiểm tra để quản lý cuộc đời của cơ sở dữ liệu tạm thời truyền đạt rõ ràng ranh giới của nó trong bối cảnh của các bài kiểm tra.Ẩn nó bên trong một tùy chỉnh AutoFixture, theo ý kiến của tôi, sẽ làm cho nó ít rõ ràng hơn và, cho là, khó sử dụng hơn.
'DisposableTrackingCustomization' trong AutoFixture có thể được sử dụng theo nhiều cách khác nhau và quản lý các công cụ tương tự như vậy (có cái nhìn về impl của nó) Khung kiểm thử nào (có hack cho xUnit mà lưu có sử dụng' using' và/hoặc gọi ' Fixture.Dispose())? Sử dụng AutoFixture.xUnit.net? Xem thêm https://github.com/AutoFixture/AutoFixture/issues/17 –