2012-09-12 117 views
18

我正在嘗試使用Xunit設置我的測試。我有一個要求刪除文件夾開始測試中的所有圖像,然後每個方法都會進行一些圖像大小調整並將其輸出的副本保存到文件夾中。該文件夾只能清空一次,然後每個方法將自己的圖像保存到文件夾中。如何在xUnit.net測試中只運行一次設置代碼

當我使用IUseFixture<T>時,ClearVisualTestResultFolder函數在每次測試之前仍然被調用,所以我只能得到一個文件夾中的圖像。

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 
    } 
} 

如果我把ClearVisualTestResultFolder在構造函數,它也正在爲每個測試方法調用一次。在所有測試方法執行之前,我只需要運行一次,我該如何實現呢?

如果重要,我使用ReSharper測試跑步者。

回答

25

按照xUnit discussion topic的指導,看起來您需要在Fixture上實現一個構造函數,並且還實現了IDisposable。下面是表現你想要的方式完整的示例:

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"); 
     } 
    } 
} 

當從控制檯亞軍運行此,你會看到下面的輸出:

d:\的xUnit> xunit.console.clr4 .exe test.dll/html foo.htm xUnit.net 控制檯測試運行器(64位.NET 4.0.30319.17929)2007-11 Microsoft Corporation版權所有(c) 。

xunit.dll:版本1.9.1.1600測試組件:Test.dll的

SomeFixture構造函數:這應該只運行一次

測試完成:2 SomeFixture 2

:處置SomeFixture

2總,0失敗,跳過0,把0.686秒

然後,當你打開測試輸出文件foo.htm時,你會看到另一個測試輸出。

6

IUseFixture<T>.SetFixture被每次測試調用一次。夾具本身只能創建一次。

換句話說,你不應該在你的SetFixture方法中做任何事情,但你應該在Fixture構造函數中觸發它。

一次性清理,實現對燈具的IDisposable.Dispose(它不是必需的,雖然)

請注意,這是一個壞主意,(甚至可能)測試之間的共享狀態。最好使用TemporaryDirectoryFixturelike this one

11

xUnit.net V1老IUseFixture<T>接口。x已被兩個新接口取代 :IClassFixture<T>ICollectionFixture<T>。在 此外,將夾具值注入到您的測試 中的機制已從屬性設置器更改爲構造器參數。 類燈具創建一次,並在相同的 類的所有測試中共享(很像舊的IUseFixture)。採集固定裝置以相同的方式工作 ,除了單個實例在相同測試集合中的所有測試 之間共享。

相關問題