2012-09-12 24 views
18

Tôi đang cố gắng thiết lập các thử nghiệm của mình bằng Xunit. Tôi có một yêu cầu để xóa tất cả các hình ảnh trong một thư mục bắt đầu của các bài kiểm tra, và sau đó mỗi phương pháp hiện một số hình ảnh thay đổi kích thước và lưu một bản sao của đầu ra của nó vào thư mục. Thư mục chỉ nên làm trống một lần, và sau đó mỗi phương pháp sẽ lưu hình ảnh của riêng mình vào thư mục.Làm thế nào để chạy mã thiết lập chỉ một lần trong một bài kiểm tra xUnit.net

Khi tôi sử dụng IUseFixture<T>, chức năng ClearVisualTestResultFolder vẫn đang được gọi trước mỗi lần kiểm tra, vì vậy tôi chỉ kết thúc bằng một hình ảnh trong thư mục.

public class Fixture 
{ 
    public void Setup() 
    { 
     ImageHelperTest.ClearVisualTestResultFolder(); 
    } 
} 

public class ImageHelperTest : IUseFixture<EngDev.Test.Fixture> 
{ 
    public void SetFixture(EngDev.Test.Fixture data) 
    { 
     data.Setup(); 
    } 

    public static void ClearVisualTestResultFolder() 
    { 
     // Logic to clear folder 
    } 
} 

Nếu tôi đặt ClearVisualTestResultFolder trong hàm tạo, nó cũng được gọi một lần cho mọi phương pháp thử nghiệm. Tôi cần điều này chỉ cần chạy một lần trước khi tất cả các phương pháp thử nghiệm được thực hiện, làm thế nào tôi có thể đạt được điều này?

Nếu có vấn đề, tôi sử dụng nhân tố thử nghiệm ReSharper.

Trả lời

25

Làm theo hướng dẫn trong xUnit discussion topic này, có vẻ như bạn cần triển khai một hàm tạo trên Lịch thi đấu và cũng triển khai IDisposable. Đây là một mẫu hoàn chỉnh mà ứng xử theo cách bạn muốn:

using System; 
using System.Diagnostics; 
using Xunit; 
using Xunit.Sdk; 

namespace xUnitSample 
{ 
    public class SomeFixture : IDisposable 
    { 
     public SomeFixture() 
     { 
      Console.WriteLine("SomeFixture ctor: This should only be run once"); 
     } 

     public void SomeMethod() 
     { 
      Console.WriteLine("SomeFixture::SomeMethod()"); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("SomeFixture: Disposing SomeFixture"); 
     } 
    } 

    public class TestSample : IUseFixture<SomeFixture>, IDisposable 
    { 
     public void SetFixture(SomeFixture data) 
     { 
      Console.WriteLine("TestSample::SetFixture(): Calling SomeMethod"); 
      data.SomeMethod(); 
     } 

     public TestSample() 
     { 
      Console.WriteLine("This should be run once before every test " + DateTime.Now.Ticks); 
     } 

     [Fact] 
     public void Test1() 
     { 
      Console.WriteLine("This is test one."); 
     } 

     [Fact] 
     public void Test2() 
     { 
      Console.WriteLine("This is test two."); 
     } 

     public void Dispose() 
     { 
      Console.WriteLine("Disposing"); 
     } 
    } 
} 

Khi chạy này từ giao diện điều khiển Á hậu, bạn sẽ thấy kết quả như sau:

D: \ xUnit> xunit.console.clr4 .exe test.dll/html foo.htm xUnit.net runner thử nghiệm giao diện điều khiển (64-bit .NET 4.0.30319.17929) Bản quyền (C) 2007-11 Tập đoàn Microsoft.

xunit.dll: Phiên bản 1.9.1.1600 Kiểm tra lắp ráp: test.dll

SomeFixture ctor: Đây chỉ nên chạy một lần

Kiểm tra hoàn tất: 2 của 2

SomeFixture: Vứt bỏ SomeFixture

2 tổng số, 0 không thành công, 0 bỏ qua, mất 0,686 giây

Sau đó, khi bạn mở tập tin đầu ra thử nghiệm foo.htm, bạn sẽ thấy kết quả thử nghiệm khác.

6

IUseFixture<T>.SetFixture được gọi một lần cho mỗi lần kiểm tra. Bản thân Lịch thi đấu chỉ được tạo một lần.

Nói cách khác, bạn không nên làm bất cứ điều gì trong phương pháp SetFixture của mình, nhưng thay vào đó bạn nên kích hoạt nó trong hàm dựng của Lịch thi đấu.

Đối với một lần dọn dẹp, thực hiện một IDisposable.Dispose trên Lịch thi đấu (nó không cần thiết mặc dù)

Lưu ý rằng đó là một ý tưởng tồi để được (thậm chí có khả năng) nhà nước chia sẻ giữa các xét nghiệm. Tốt nhất để sử dụng một số TemporaryDirectoryFixturelike this one.

11

Các cũ giao diện IUseFixture<T> trong xUnit.net v1.x đã được thay thế bằng hai giao diện mới: IClassFixture<T>ICollectionFixture<T>. Trong Ngoài ra, cơ chế để bơm các giá trị cố định vào các thử nghiệm của bạn đã thay đổi từ các bộ định vị thuộc tính thành các đối số hàm tạo. Class đồ đạc được tạo ra một lần và chia sẻ giữa tất cả các bài kiểm tra trong cùng một lớp học (giống như IUseFixture cũ). Bộ sưu tập đồ đạc làm việc cùng một cách, ngoại trừ trường hợp duy nhất được chia sẻ giữa tất cả các bài kiểm tra trong cùng một bộ sưu tập kiểm tra.

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