C# 如何编写一个测试来确保所有方法是否都抛出异常
我有几种方法需要一个接口实例C# 如何编写一个测试来确保所有方法是否都抛出异常,c#,unit-testing,C#,Unit Testing,我有几种方法需要一个接口实例ITable。现在,我不确定是否值得为每种方法的这个参数创建一个测试,这似乎是一个突破 因此,我想知道是否有可能在一个测试方法中调用所有这些方法,并断言它们都因相同的原因失败——在我的例子中,一个ArgumentException我想我有一个解决方案,它不好,但它确实有效。为此,我只需循环类型中的所有方法,以测试并检查实现接口的方法列表中是否有任何参数: var funcs = typeof(MyType).GetMethods().Where(x => x.G
ITable
。现在,我不确定是否值得为每种方法的这个参数创建一个测试,这似乎是一个突破
因此,我想知道是否有可能在一个测试方法中调用所有这些方法,并断言它们都因相同的原因失败——在我的例子中,一个
ArgumentException
我想我有一个解决方案,它不好,但它确实有效。为此,我只需循环类型中的所有方法,以测试并检查实现接口的方法列表中是否有任何参数:
var funcs = typeof(MyType).GetMethods().Where(x => x.GetParameters().Any(y => typeof(ITable).IsAssignableFrom(y.ParameterType)));
现在我可以循环这个集合并通过反射调用它的方法。最后,我只需计算当异常被命中时,通过增加计数器抛出类型为ArgumentException
的eception的频率:
foreach (var func in funcs)
{
try {func.Invoke(myInstance, myArgs);}
catch(ArgumentException) { i++; }
}
如果计数器等于找到的方法数,则测试成功:
Assert.AreEqual(i, expectedCount);
您可以使用它,尽管默认情况下它将测试ArgumentNullException
,因为null
实际上是接口的唯一无效值
您可以编写类似这样的代码来检查所有成员的无效值(包括将ITable
作为参数的成员):
如果Verify
调用传递null
作为参数不会引发ArgumentNullException
,则该调用将引发异常
缩小选择范围有很多选择。例如,有一个Verify
重载接受IEnumerable
,因此您可以使用反射来查询具有ITable
参数的所有成员的类型
如果您需要有关AutoFixture或AutoFixture.idiom的特定帮助,请提出一个新问题并将其标记为AutoFixture,因为回答注释中的复杂问题可能会有点烦人:)您使用的是什么单元测试框架?Visual Studio NUnit extensionXUnit或NUnit为此提供了测试参数,我相信还有其他测试框架也会这样做。@HimBromBeere答案是:@SergeyKolodiy没有
断言。在VS integrated NUnit Framework中抛出,以这种方式编写代码将使跟踪和分析故障变得极其困难;我强烈建议您研究一下马克在回答中提到的AutoFixture.Idioms
,假设您对这类需求有任何感兴趣的数量,因为它确实是为工作而设计的。
var fixture = new Fixture();
var assertion = new GuardClauseAssertion(fixture);
assertion.Verify(typeof(MyType));