2016-04-13 7 views
1

ユニットテスティングで解決できなかった問題があります。xUnit/Shouldly/AutoMoq/Autofixtureでは、テスト自体に<T>として使用できるInlineAutoMoqDataを使用してTypeを渡すことはできますか?

The InlineAutoMoqDataのパラメータで提供されるTypeをT Shouldly's Should.Throwメソッドとして使用できるようにしたいと考えています。これにより、メソッドに関連する複数の例外が存在する場合、さまざまな行テスト(このフレームワークのインライン理論)を作成してさまざまな例外タイプを予想できます。

可能かどうかは確信していますが、単体テストそのものの例があります。

[Theory] 
[InlineAutoMoqData("bork", typeof(FileTypeNotRecognizedException))] 
public void Build_ReturnsSpecificException_FileNamePassedIn(string fileName, Type expected, ProcessFactory sut) 
{ 
    Should.Throw<expected>(() => sut.Build(fileName)); 
} 

困惑し、これを掲示取得する前に、私は、見ての質問があった:Dynamically Create a generic type for templateCreating a Generic<T> type instance with a variable containing the Type

は、この可能性のようなものですか?

編集:

私はxUnitの中で、私はAssert.Throws(タイプ、委任)メソッドを介してこれを実現できることがわかります。

[Theory] 
[InlineAutoMoqData("bork", typeof(FileTypeNotRecognizedException))] 
public void Build_ReturnsSpecificException_FileNamePassedIn(string fileName, Type expected, ProcessFactory sut) 
{ 
    Assert.Throws(expected,() => sut.Build(fileName)); 
} 

タイプを汎用メソッドにしたいときにはいつでも、それを達成する方法があるかどうかを知りたいと思います。

答えて

1

Reflectionを使用する以外は、あなたが言及した2つのリンクと似ていません。

しかし、あなたが望むことを達成するために少しトリックを行うことができます。これは醜いと非現実的であると私はそれを使用することをお勧めしますが、ちょうどそれの楽しみのためにしないでください...

はあなたのパラメータ化テストを含む一般的なクラスを作成します。すべてのパラメータ(例外の種類については

public class Test<T> where T : Exception 
{ 
    public virtual void Build_ReturnsSpecificException_FileNamePassedIn(
     string fileName, 
     ProcessFactory sut) 
    { 
     Assert.Throws<T>(() => sut.Build(fileName)); 
    } 
} 

を)あなたは、一般的なものから継承するクラスを作成し、テストメソッドをオーバーライドし、InlineAutoMoqData使用:もちろん

public class TestFileNotFound : Test<FileTypeNotRecognizedException> 
{ 
    [Theory] 
    [InlineAutoMoqData("bork")] 
    public override void Build_ReturnsSpecificException_FileNamePassedIn(string fileName, 
     ProcessFactory sut) 
    { 
     base.Build_ReturnsSpecificException_FileNamePassedIn(fileName, sut); 
    } 
} 
public class TestAnotherException : Test<Exception> 
{ 
    [Theory] 
    [InlineAutoMoqData("borg")] 
    public override void Build_ReturnsSpecificException_FileNamePassedIn(string fileName, 
     ProcessFactory sut) 
    { 
     base.Build_ReturnsSpecificException_FileNamePassedIn(fileName, sut); 
    } 
} 

を、あなたの代わりにジェネリッククラスのジェネリックメソッドを使用して同じことを行うことができ、それはのように愚かなようですウェル:

0あなた自身を発見したよう
public void Build_ReturnsSpecificException_FileNamePassedIn<TException>(string fileName, 
    ProcessFactory sut) 
    where TException : Exception 
{ 
    Assert.Throws<TException>(() => sut.Build(fileName)); 
} 

[Theory] 
[InlineAutoMoqData("bork")] 
public void Build_ReturnsSpecificException_FileNamePassedIn(string fileName, 
    ProcessFactory sut) 
{ 
    Build_ReturnsSpecificException_FileNamePassedIn<FileTypeNotRecognizedException>(fileName, sut); 
} 

[Theory] 
[InlineAutoMoqData("borg")] 
public void Build_ReturnsAnotherException_FileNamePassedIn(string fileName, 
    ProcessFactory sut) 
{ 
    Build_ReturnsSpecificException_FileNamePassedIn<Exception>(fileName, sut); 
} 

は、xUnit.netはTypeかかり非ジェネリックAssert.Throwsを持っており、あなたはこのハックの代わりにそれを使用する必要があります。

+0

基本クラスのテストに '[Theory]'と '' [InlineAutoMoqData] '属性を入れてみませんか? http://blog.ploeh.dk/2011/05/09/GenericunittestingwithxUnit.netその後、これらの上書きはすべて必要ありません。 –

+0

インライン化されたデータ(fileName)が例外に依存しない場合は、そうです。それは事実ではないようです。 fileNameが変更されると例外が変わるようですが、それ以外の場合、例外をインライン化するポイントは何ですか? –

関連する問題