如何编写测试以确保所有方法是否抛出异常

时间:2015-08-04 13:32:15

标签: c# unit-testing

我有几种方法需要接口ITable的实例。现在我不确定是否值得为每个方法创建此参数的测试,这似乎是DRY的中断。

所以我想知道是否有可能在一个单一的测试方法中调用所有这些方法,并断言所有这些方法都出于同样的原因而失败 - 在我的例子中是ArgumentException

2 个答案:

答案 0 :(得分:1)

您可以使用AutoFixture.Idioms,但默认情况下会对ArgumentNullException进行测试,因为null实际上是{em>无效的唯一值接口

您可以编写类似这样的内容来检查所有成员的无效值(包括以ITable为参数的成员):

var fixture = new Fixture();
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(MyType));

Verify调用如果传递null作为参数并不会抛出ArgumentNullException,则会抛出异常。

有很多选项可以缩小选择范围。例如,Verify重载需要IEnumerable<MemberInfo>,因此您可以使用Reflection来查询具有ITable参数的所有成员的类型。

如果您需要AutoFixture或AutoFixture.Idioms的特定帮助,请提出一个新问题并将其标记为 autofixture ,因为在评论中回答复杂问题可能会有点令人厌烦:)

答案 1 :(得分:0)

我认为我有一个解决方案,它并不好,但它确实有效。为此我只需循环遍历类型中的所有方法来测试并检查方法列表中是否有任何实现接口的参数:

var funcs = typeof(MyType).GetMethods().Where(x => x.GetParameters().Any(y => typeof(ITable).IsAssignableFrom(y.ParameterType)));

现在我可以循环这个集合并通过反射调用它的方法。最后,我只计算在遇到异常时通过递增计数器来抛出类型ArgumentException的异常的频率:

foreach (var func in funcs)
{
    try {func.Invoke(myInstance, myArgs);}
    catch(ArgumentException) { i++; }
}

如果计数器等于测试成功的方法数:

Assert.AreEqual(i, expectedCount);