ArgumentException无法在测试参数中将Int32转换为Decimal
本文关键字:Int32 转换 Decimal 参数 测试 ArgumentException | 更新日期: 2023-09-27 18:27:30
我正在设置一个新的集成服务器,我看到测试失败,并出现以下错误:
System.ArgumentException : Object of type 'System.Int32' cannot be converted to type 'System.Decimal'.
这些测试在许多其他环境中运行时没有问题。一位队友建议我在新机器上查看区域设置。这些设置与其他环境的设置相同。
这是我看到的一个例子:
[TestCase(1, TestName = "SampleTest_ArgumentIsInt")] // this test fails
[TestCase(1.0, TestName = "SampleTest_ArgumentIsDouble")] // this test passes
public void ShouldBeOkay(decimal arg)
{
...test stuff...
}
失败与测试中的断言无关。如TestCase中所示,当参数明确为十进制时,不会发生ArgumentException。
第二个TestCase实现了最接近的修复。但我想了解根本原因:为什么错误发生在一个环境中,而没有发生在其他环境中?
提前感谢您的帮助。
根据评论者的请求,以下是Team City正在报告的堆栈跟踪:
Test(s) failed. System.ArgumentException : Object of type 'System.Int32' cannot be converted to type 'System.Decimal'.
at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at NUnit.Core.Reflect.InvokeMethod(MethodInfo method, Object fixture, Object[] args)
at NUnit.Core.TestMethod.RunTestMethod(TestResult testResult)
at NUnit.Core.TestMethod.doTestCase(TestResult testResult)
通过将NUnit更新到最新版本解决了此问题。我追了一会儿,直到一位同事注意到新服务器上的NUnit版本比我们在所有其他CI机器上使用的最新版本旧了几个版本。
失败的测试都使用了NUnit参数化的测试用例属性[TestCase…],其中NUnit将参数传递到测试方法中,并根据需要进行转换。
感谢评论者花时间提供帮助。
我希望这个答案能帮助其他遇到同样问题的人。