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)

ArgumentException无法在测试参数中将Int32转换为Decimal

通过将NUnit更新到最新版本解决了此问题。我追了一会儿,直到一位同事注意到服务器上的NUnit版本比我们在所有其他CI机器上使用的最新版本旧了几个版本。

失败的测试都使用了NUnit参数化的测试用例属性[TestCase…],其中NUnit将参数传递到测试方法中,并根据需要进行转换。

感谢评论者花时间提供帮助。

我希望这个答案能帮助其他遇到同样问题的人。