1

如果操作数不合适,我有一个运算符会抛出。(具体来说,它在基于 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 而失败。
  • 第二个失败,出现“只有赋值、调用、递增、递减和新对象表达式可以用作语句”错误。
  • 第三个因“Delegate 'NUnit.Framework.TestDelegate' 不接受 1 个参数”而失败。
  • 第四个(以及我能找到的所有变体)不会让您分配给未声明的变量(真的不足为奇)

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

我错过了什么吗?如果没有,我能否得到确认,以便下一个尝试查找此问题的人有答案。

4

2 回答 2

2

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

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

你也可以只调用一个方法:

Assert.Throws<InvalidOperationException>(() => 
       (originalValue * badDecimalMultiplier).ToString());
于 2013-11-10T13:22:43.170 回答
0

在我写最后一行时,我想出了解决方案:

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

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

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

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

于 2013-11-10T13:23:29.140 回答