1

単体テストで解決できなかった問題があります。最も簡潔に言うと、次のようになると思います。

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

可能かどうかはわかりませんが、単体テスト自体の例を次に示します。

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

困惑してこれを投稿する前に、私が見た質問は次のとおりです

このようなことは可能ですか?

編集:

xUnit では、Assert.Throws(Type, Delegate) メソッドを使用してこれを実現できることがわかりました。

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

タイプをジェネリックメソッドにしたいときはいつでもそれを達成する方法があるかどうかを知りたいです。

4

1 に答える 1

1

あなたが言及した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);
    }
}

もちろん、ジェネリック クラスの代わりにジェネリック メソッドを使用して同じことを行うこともできますが、それもばかげているように思えます。

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

Assert.Throwsあなた自身が発見したように、xUnit.net には aを取る非ジェネリックがTypeあり、このハックの代わりにそれを使用する必要があります。

于 2016-04-13T20:30:35.087 に答える