我正在设置一个新的集成服务器,我一直看到测试失败并出现以下错误:
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)
答案 0 :(得分:0)
通过将NUnit更新到最新版本解决了该问题。我跟踪了我的尾巴一段时间,直到一位同事发现 new 服务器上的NUnit版本比我们在所有其他CI机器上使用的最新版本早了几个版本。
失败的测试全部使用NUnit参数化测试用例属性[TestCase ...],其中NUnit将参数传递给测试方法并根据需要进行转换。
感谢评论者花时间提供帮助。
我希望这个答案有助于其他人遇到同样的问题。