测试*运算符*是否抛出异常的最佳方法

时间:2013-11-10 13:20:00

标签: c# nunit

如果操作数不合适,我有一个操作符会抛出。 (特别是它在基于int的类上进行十进制乘法 - 如果有意义则允许(例如2 * 0.5)但如果结果不是圆数则抛出。(例如2 * 0.3))

看来我不能使用nUNit的Assert.Throws<>()来测试它,因为我能想到的每一种方式都会给我一个编译错误:

Assert.Throws<InvalidOperationException>(originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(dummy => originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(dummy => dummy = originalValue * badDecimalMultiplier);
Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier);
  • 第一个尝试将操作的结果作为参数传递给Throws()失败,因为Throws只接受TestDelegate。
  • 第二个失败,“只有赋值,调用,递增,递减和新对象表达式可以用作语句”错误。
  • 第三个失败,“委托'NUnit.Framework.TestDelegate'不接受1个参数”。
  • 第四个(以及我能找到的所有变体)都不允许你分配一个未声明的变量(真的不足为奇)

所以我认为我必须手动捕获异常并测试它? 那或者定义一个实际的方法来保持操作,这似乎没有那么好。

我错过了什么吗? 如果没有,我可以得到确认,以便下一个试图查看它的人有答案。

2 个答案:

答案 0 :(得分:2)

您可以在lambda之外声明一个变量:

MyClass dummy;
Assert.Throws<InvalidOperationException>(() => 
         dummy = originalValue * badDecimalMultiplier);

您也可以调用方法:

Assert.Throws<InvalidOperationException>(() => 
       (originalValue * badDecimalMultiplier).ToString());

答案 1 :(得分:0)

在我写完最后一行时,我找到了解决方案:

  MyIntValuedClass dummy;
  Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier);

现在投掷()很高兴,因为它有一个委托。 代表很高兴,因为它没有参数。 操作很开心,因为它分配给定义的变量。

R#抱怨虚假从未被使用过,但这并不奇怪。

这不是最好的解决方案,我欢迎其他想法,但我想确保在这里有一个答案可供下一个人来看。