2013-03-19 34 views
7

Tôi đang sử dụng tùy chỉnh Tự động sửa lỗi để kiểm tra kho lưu trữ truy cập vào SQL Compact DB.Gọi phương pháp Vứt bỏ trên tùy chỉnh Tự động trộn

Sẽ rất hữu ích cho tôi khi xóa cơ sở dữ liệu này ngay khi thử nghiệm được hoàn tất. Bởi vì db được tạo ra trong constructor tùy biến, tôi nghĩ rằng nơi tốt nhất để xóa nó là trong phương thức vứt bỏ.

Mã mà tôi đang nghĩ đến là:

internal class ProjectRepositoryCustomization : ICustomization 
{ 
    private readonly String _dbLocation; 

    public ProjectRepositoryCustomization() 
    { 
     var tempDbLocation = Path.Combine(Path.GetTempPath(), "TempDbToDelete"); 
     if (!Directory.Exists(tempDbLocation)) 
     { 
      Directory.CreateDirectory(tempDbLocation); 
     } 

     _dbLocation = Path.Combine(tempDbLocation, Guid.NewGuid().ToString("N") + ".sdf"); 
    } 

    public void Customize(IFixture fixture) 
    { 
     DataContextConfiguration.database = _dbLocation; 

     var dataContextFactory = new BaseDataContextFactory(); 
     var projRepository = new ProjectRepository(dataContextFactory); 
     fixture.Register(() => projRepository); 
    } 

    public void Dispose() 
    { 
     if (File.Exists(_dbLocation)) 
     { 
      File.Delete(_dbLocation); 
     } 
    } 
} 

phải là có thể làm điều gì đó tương tự?

+5

'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 –

Trả lời

6

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ờiSingleton. [...] 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ướcsau 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.

Các vấn đề liên quan