Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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#_Nunit - Fatal编程技术网

C# 测试*运算符*是否引发异常的最佳方法

C# 测试*运算符*是否引发异常的最佳方法,c#,nunit,C#,Nunit,我有一个运算符,如果操作数不合适,它将抛出。(特别是在基于int的类上执行十进制乘法-如果有意义(例如2*0.5),则允许使用十进制乘法,但如果结果不是整数,则抛出十进制乘法。(例如2*0.3)) 似乎我不能使用nUNit的Assert.Throws()来测试这个,因为我所能想到的调用它的每一种方法都会给我一个编译器错误: Assert.Throws<InvalidOperationException>(originalValue * badDecimalMultiplier); A

我有一个运算符,如果操作数不合适,它将抛出。(特别是在基于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);
Assert.Throws(originalValue*baddecimal乘数);
抛出(dummy=>originalValue*baddecimal乘数);
抛出(dummy=>dummy=originalValue*baddecimal乘数);
抛出(()=>dummy=originalValue*baddecimal乘数);
  • 第一个函数尝试将操作结果作为参数传递给Throws(),但失败了,因为Throws只接受TestDelegate
  • 第二个失败,出现“只能将赋值、调用、递增、递减和新对象表达式用作语句”错误
  • 第三个失败,原因是“委托'NUnit.Framework.TestDelegate'不接受1个参数”
  • 第四个(以及我能找到的所有变体)不允许您分配给未声明的变量(这并不奇怪)
所以我想我必须手动捕获异常并测试它? 或者定义一个实际的方法来保存该操作,这似乎并没有好多少

我遗漏了什么吗?
如果没有,我是否可以得到确认,以便下一个尝试查找此项的人有一个答案。

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

MyClass dummy;
Assert.Throws<InvalidOperationException>(() => 
         dummy = originalValue * badDecimalMultiplier);
MyClass虚拟;
Assert.Throws(()=>
虚拟=原始值*badDecimalMultiplier);
您也可以只调用一个方法:

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

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

  MyIntValuedClass dummy;
  Assert.Throws<InvalidOperationException>(() => dummy = originalValue * badDecimalMultiplier);
MyIntValuedClass虚拟;
抛出(()=>dummy=originalValue*baddecimal乘数);
现在Throws()很高兴,因为它有一个委托。 代理很高兴,因为它没有参数。 操作是愉快的,因为它正在分配给一个已定义的变量

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


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

我很震惊。。我不敢相信有人能读到我的问题,找出答案,然后把它打出来,而我还没来得及把我在发帖前找到的答案打出来。我对这个社区感到敬畏