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

时间:2014-10-23 13:22:05

标签: c# windows unit-testing nunit

我正在设置一个新的集成服务器,我一直看到测试失败并出现以下错误:

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)

1 个答案:

答案 0 :(得分:0)

通过将NUnit更新到最新版本解决了该问题。我跟踪了我的尾巴一段时间,直到一位同事发现 new 服务器上的NUnit版本比我们在所有其他CI机器上使用的最新版本早了几个版本。

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

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

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