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

标签 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)

这让我在过去几天没有(单元)测试的情况下编写了很多代码,所以如果有人对原因和/或解决方案有任何想法,将不胜感激。

最佳答案

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 正在寻找该接口(interface),因此您正在引用使用它的构建之一。由于它不可用,因此您在一个不包含它的平台上。

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

不幸的是,我对 Unity 方面的问题没有任何帮助。

关于unit-testing - Unity 中的单元测试 - 获取 InvalidCastException - 为什么?以及如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47335493/

相关文章:

python - 如何根据传递给 open() 的参数以不同方式模拟打开

java - 使用 spring-test-mvc 进行 Spring Controller 单元测试失败

sql - 在不影响数据库的情况下测试存储过程

unity3d - 如何在 Unity 中更改 Canvas 位置?

c# - unity c#运行shell脚本

c# - UWP Apps 中的模拟框架

Java相当于python环境错误?

exception - JavaFX:无法设置绑定(bind)值异常

c# - Unity动画播放两次

PHP:我们如何在生产网站上禁用异常消息并将它们保留在开发中?