0

列挙値のコレクションのテストを作成する必要があります。それらの一部を使用すると、例外が発生することが予想され、テストでそれを処理する必要があります。

[ExpectedException]列挙値のパラメーターを使用してテストメソッドを記述できます。foreach を使用して、例外が発生すると予想される列挙値を列挙するメソッドを作成できます。しかし、この場合、最初の例外が発生し、残りの列挙値はチェックされないと思います。

列挙値を正しく列挙し、1 つまたは 2 つのメソッドで例外をチェックする方法は?

チェックする必要がある列挙値ごとに1つの新しいメソッドを作成したくありません。

4

3 に答える 3

4

属性で NUnits パラメーター化されたテストを使用できTestCaseます。

これにより、2 つのテストを記述できます。1 つは例外をスローする必要がある列挙値用で、もう 1 つは例外をスローしない列挙値用です。

[Test]
[TestCase(MyEnum.ExceptionValue1)]
[TestCase(MyEnum.ExceptionValue2)]
[TestCase(MyEnum.ExceptionValue3)]
public void MethodShouldThrowForInvalidValues(MyEnum value)
{
    var sut = new MyClass();

    Assert.Throws<MyException>(() => sut.MyMethod(value));
}

[Test]
[TestCase(MyEnum.ValidValue1)]
[TestCase(MyEnum.ValidValue2)]
[TestCase(MyEnum.ValidValue3)]
public void MethodShouldNotThrowForValidValues(MyEnum value)
{
    var sut = new MyClass();

    sut.MyMethod(value);

    Assert.True(true);
}

別の方法は、メソッドが例外をスローする必要があるすべての列挙値を返す型またはプロパティを使用することです。

[Test]
[TestCaseSource("InvalidEnumValues")]
public void MethodShouldThrowForInvalidValues(MyEnum value)
{
    var sut = new MyClass();

    Assert.Throws<MyException>(() => sut.MyMethod(value));
}


public IEnumerable<MyEnum> InvalidEnumValues
{
    get
    {
        // here you can put a foreach if you like
    }
}
于 2013-01-11T12:38:17.177 に答える
0

テスト コードは次のようになります。フラグTestMethodを渡す必要がないように、2 つのメソッドに分割することを検討してください。bool

[TestFixture]
class Test
{

    [TestCase(MyEnum.Foo, false)]
    [TestCase(MyEnum.Bar, true)]
    public void TestMethod(MyEnum myEnum, bool shouldExceptionBeThrown)
    {
        if (shouldExceptionBeThrown)
            Assert.Throws<Exception>(() => MethodUnderTest(myEnum));
        else
            MethodUnderTest(myEnum);
    }

    public void MethodUnderTest(MyEnum myEnum)
    {
        if(myEnum == MyEnum.Bar)
            throw new Exception();
    }
}

internal enum MyEnum
{
    Foo,
    Bar
}
于 2013-01-11T12:41:35.750 に答える
0

TestCaseSource が大規模なデータ ドリブン テストにどのように役立つかの例を次に示します。

テスト データ ソースを定義する方法は次のとおりです。

private class InputData
{
    private Dictionary<string, string> _keywords;
    public InputData()
    {
        _keywords = new Dictionary<string, string>
                       {
                           {"abc", "test case 1"},
                           {"xyz", "test case 2"},
                       };
    }
}

そしてそれは使用法です:

[TestCaseSource(typeof(InputData), "_keywords")]
public void MethodShouldNotThrowForValidValues(KeyValuePair<string, string> value)
{
    var sut = new MyClass();

    var val = sut.MyMethod(value);

    Assert.True(val);
}
于 2013-01-11T12:50:58.677 に答える