2012-09-12 10 views
18

Xunitを使用してテストをセットアップしようとしています。私は、テストのフォルダ開始のすべての画像を削除する必要がありますし、各メソッドはいくつかの画像のサイズ変更を行い、その出力をフォルダに保存します。フォルダは一度空にしてから、それぞれの方法で自分のイメージをフォルダに保存します。xunit.netテストでセットアップコードを1回だけ実行する方法

私がIUseFixture<T>を使用すると、すべてのテストの前にClearVisualTestResultFolder関数が呼び出されているため、フォルダ内に1つの画像しか表示されません。

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を置く場合、それはまた、すべてのテストメソッドに1回呼び出されています。私はすべてのテストメソッドが実行される前に一度実行する必要があります、どのようにこれを達成することができますか?

重要な場合は、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)Copyright(C) 2007-11 Microsoft Corporation。

xunit.dll:バージョン1.9.1.1600テストアセンブリ:TEST.DLL

SomeFixtureのCTOR:2

の2 SomeFixture:廃棄SomeFixture

これは、一度だけ完全

テストを実行する必要があります

2の合計、0、0はスキップされ、失敗しました0.686秒

次に、テスト出力ファイルfoo.htmをクラックさせると、別のテスト出力が表示されます。

6

IUseFixture<T>.SetFixtureは、テストごとに1回呼び出されます。 Fixture自体は一度だけ作成されます。

つまり、SetFixtureメソッドでは何もしてはいけませんが、代わりにFixtureコンストラクタでトリガする必要があります。

1回のクリーンアップのために、(それはしかし必須ではありません)それがために悪い考えだと

注テスト間(でも潜在的に)共有状態をフィクスチャにIDisposable.Disposeを実装します。 TemporaryDirectoryFixturelike this oneを使用するのが最適です。

11

xUnit.net v1の中の古いIUseFixture<T>インターフェース。xは、 の2つの新しいインターフェイスで置き換えられました。IClassFixture<T>ICollectionFixture<T>です。 では、フィクスチャ値をテストに挿入するためのメカニズム がプロパティセッターからコンストラクター引数に変更されました。 Class のフィクスチャは一度作成され、同じ クラスのすべてのテストで共有されます(古いIUseFixtureとよく似ています)。コレクションフィクスチャは、同一のテストコレクション内のすべてのテスト の間で単一インスタンスが共有される点を除いて、同じ方法で を処理します。

関連する問題