27

Xunitを使用してテストをセットアップしようとしています。テストの開始時にフォルダ内のすべての画像を削除する必要があります。その後、各メソッドで画像のサイズ変更を行い、その出力のコピーをフォルダに保存します。フォルダを空にする必要があるのは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回呼び出されます。すべてのテストメソッドを実行する前に、これを1回だけ実行する必要がありますが、どうすればこれを実現できますか?

重要な場合は、ReSharperテストランナーを使用します。

4

3 に答える 3

30

このxUnitディスカッショントピックのガイダンスに従うと、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-11MicrosoftCorporation。

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

SomeFixture ctor:これは1回だけ実行する必要があります

完了したテスト:2/2

SomeFixture:SomeFixtureの破棄

合計2、失敗0、スキップ0、0.686秒かかりました

次に、テスト出力ファイルfoo.htmをクラックして開くと、他のテスト出力が表示されます。

于 2012-09-12T02:13:31.070 に答える
21

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

于 2015-08-24T06:02:19.920 に答える
6

注これはxUnit.netv1にのみ適用されます-それがあなたの場合でない限り、受け入れられた答えを参照してください


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

つまり、SetFixtureメソッドでは何も実行しないでください。代わりに、Fixtureコンストラクターでトリガーする必要があります。

IDisposable.Dispose1回限りのクリーンアップの場合は、フィクスチャにを実装します(ただし必須ではありません)。

テスト間で状態を(潜在的に)共有することは悪い考えであることに注意してください。TemporaryDirectoryFixture このようなものを使用するのが最適です。

于 2012-09-12T08:07:10.377 に答える