Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写一个测试来确保所有方法是否都抛出异常_C#_Unit Testing - Fatal编程技术网

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));