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

Xen*_*oRo 5 nunit unit-testing exception unity-game-engine

我试图在SO方面的问题中尽可能具体和有帮助,但对于这一问题,那几乎没有任何意义,因为我绝对没有暗示为什么会这样的最微妙线索。

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

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

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)
Run Code Online (Sandbox Code Playgroud)

这使我在过去的几天中几乎没有进行任何(单元)测试的代码,因此,如果有人对原因和/或解决方案有任何了解,将不胜感激。

Cha*_*lie 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)则不使用。由于 NUnit 正在寻找该接口,因此您正在引用使用它的构建之一。由于它不可用,因此您所在的平台不包含它。

一个简单的解决方法是您自己定义接口,完全按照 Microsoft 的定义复制它。您不必实现它,因为您正在使用的框架会执行此操作。当然,由于框架/平台不兼容,这可能会导致其他故障,因此最好首先解决兼容性问题。

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