带有ExpectedException的Mbunit Factory属性
有没有一种方法可以写出,当我使用Factory属性时,我预计某些输入异常? 我知道如何使用Row属性来完成它,但我需要它来动态生成测试输入。
有关函数返回提供的字符串的逆函数,请参见下面的测试示例:
[TestFixture]
public class MyTestFixture()
{
private IEnumerable<object[]> TestData
{
get
{
yield return new object[] { "MyWord", "droWyM" };
yield return new object[] { null, null }; // Expected argument exception
yield return new object[] { "", "" };
yield return new object[] { "123", "321" };
}
}
[Test, Factory("TestData")]
public void MyTestMethod(string input, string expectedResult)
{
// Test logic here...
}
}
恐怕没有内置功能将元数据(例如预期的异常)附加到来自工厂方法的一行测试参数中。
但是,一个简单的解决方案是将预期异常的类型作为测试常规参数传递(如果预计不会引发异常,则为null),并将测试代码包含在Assert.Throws
或Assert.DoesNotThrow
方法中。
[TestFixture]
public class MyTestFixture()
{
private IEnumerable<object[]> TestData
{
get
{
yield return new object[] { "MyWord", "droWyM", null };
yield return new object[] { null, null, typeof(ArgumentNullException) };
yield return new object[] { "", "", null };
yield return new object[] { "123", "321", null };
}
}
[Test, Factory("TestData")]
public void MyTestMethod(string input, string expectedResult, Type expectedException)
{
RunWithPossibleExpectedException(expectedException, () =>
{
// Test logic here...
});
}
private void RunWithPossibleExpectedException(Type expectedException, Action action)
{
if (expectedException == null)
Assert.DoesNotThrow(action);
else
Assert.Throws(expectedException, action);
}
}
顺便说一下,有一个额外的Assert.MayThrow
断言来摆脱辅助方法可能会很有趣。 它可以接受null作为预期的异常类型。 也许你可以在这里创建一个功能请求,或者你可以提交一个补丁。