Unity中的单元测试 - 获取InvalidCastException - 为什么?以及如何解决?

时间:2017-11-16 17:12:15

标签: unit-testing exception unity3d nunit

我尽量在S.O.的问题中尽可能具体和有帮助。但对于这个,嗯,这几乎没有任何意义,因为我完全没有暗示为什么会发生这种情况的最微弱的线索。

它发生在任何/每个测试(甚至是“空白”测试)。我已经尝试(卸载和)更新统一。 - 没用。

无论如何,这是异常的堆栈跟踪:

2017.11.16 14:54:24.308   ERROR System.Reflection.TargetInvocationException: Uma exceção foi acionada pelo destino de uma chamada.
System.Reflection.TargetInvocationException: Uma exceção foi acionada pelo destino de uma chamada. ---> System.InvalidCastException: Não é possível converter um objeto do tipo 'NUnit.Engine.CallbackHandler' no tipo 'System.Web.UI.ICallbackEventHandler'.
   em NUnit.Framework.Api.FrameworkController.LoadTestsAction..ctor(FrameworkController controller, Object handler)
   --- Fim do rastreamento de pilha de exceções internas ---
   em System.RuntimeMethodHandle._InvokeConstructor(Object[] args, SignatureStruct& signature, IntPtr declaringType)
   em System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   em System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   em System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo, StackCrawlMark& stackMark)
   em System.Activator.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityInfo)
   em System.AppDomain.CreateInstance(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityAttributes)
   em System.AppDomain.CreateInstanceAndUnwrap(String assemblyName, String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, Evidence securityAttributes)
   em NUnit.Engine.Drivers.NUnit3FrameworkDriver.Load(String testAssemblyPath, IDictionary`2 settings)
   em NUnit.Engine.Runners.DirectTestRunner.LoadPackage()
   em NUnit.Engine.Runners.AbstractTestRunner.Load()
   em NUnit.Engine.Runners.MasterTestRunner.LoadPackage()
   em NUnit.Engine.Runners.AbstractTestRunner.EnsurePackageIsLoaded()
   em NUnit.Engine.Runners.MasterTestRunner.NUnit.Engine.ITestRunner.Explore(TestFilter filter)
   em JetBrains.ReSharper.UnitTestRunner.nUnit30.BuiltInNUnitRunner.<>c__DisplayClass1.<RunTests>b__0()
   em JetBrains.ReSharper.UnitTestRunner.nUnit30.BuiltInNUnitRunner.WithExtensiveErrorHandling(IRemoteTaskServer server, Action action)

这使我在过去几天内没有(单元)测试的代码很多,所以如果有人对原因和/或解决方案有任何了解,那将非常感激。

1 个答案:

答案 0 :(得分:2)

Resharper使用NUnit引擎运行测试但引擎只支持针对.NET 2.0到4.5编写的测试。您正在使用的框架是.NET Standard版本之一。我可以通过查看堆栈跟踪并看到它没有对System.Web.UI.ICallbackEventHandler的引用来说明这一点。

您应该能够使用最新安装的NUnit 3 VS测试适配器在测试资源管理器中运行测试。

为了清晰起见而更新......

毫无疑问,正在使用平台不支持的nunit框架版本。这是关键所在。

框架的某些版本使用System.Web.UI.ICallbackEventHandler(.NET 2.0,3.5,4.0和4.5),而其他版本(.NET Standard 1.3和1.6)则不使用scope :order_by_my_association, lambda { select('comments.*, COUNT(listens.id) AS listens_total') .joins("LEFT OUTER JOIN listens ON listens.comment_id = comments.id") .group('comments.id') .order("listens_total DESC") } 。由于NUnit正在寻找该接口,因此您将引用其中一个使用它的构建。由于它不可用,因此您使用的平台不包含它。

一个简单的解决方法是让您自己定义界面,完全按照Microsoft的定义复制它。您不必实现它,因为您使用的框架就是这样做的。当然,由于框架/平台不兼容,这可能会导致其他失败,因此最好先解决兼容性问题。

不幸的是,我无法在问题的Unity方面提供任何帮助。