我需要为一些枚举值集合编写测试。当使用其中的一部分时,我预计会出现异常,我的测试需要处理它。
[ExpectedException]
我可以用我的枚举值和参数编写测试方法。我可以编写使用 foreach 枚举预期会引发异常的枚举值的方法。但在这种情况下,我认为将引发第一个异常并且不会检查其余枚举值。
如何正确枚举枚举值并使用单个或 2 个可能的方法检查异常?
我只是不想为我需要检查的每个枚举值使用一种新方法。
您可以将 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
}
}
以下是 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);
}
您的测试代码可能如下所示。考虑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
}