0

我需要为一些枚举值集合编写测试。当使用其中的一部分时,我预计会出现异常,我的测试需要处理它。

[ExpectedException]我可以用我的枚举值和参数编写测试方法。我可以编写使用 foreach 枚举预期会引发异常的枚举值的方法。但在这种情况下,我认为将引发第一个异常并且不会检查其余枚举值。

如何正确枚举枚举值并使用单个或 2 个可能的方法检查异常?

我只是不想为我需要检查的每个枚举值使用一种新方法。

4

3 回答 3

4

您可以将 NUnits 参数化测试与该TestCase属性一起使用。

这将允许您编写两个测试:一个用于应该引发异常的枚举值,另一个用于不应引发异常的枚举值。

[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

以下是 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 回答
0

您的测试代码可能如下所示。考虑TestMethod拆分成两种方法,这样就不需要传递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 回答