【问题标题】:Unit test in Unity - Getting an InvalidCastException - Why? And how to fix?Unity 中的单元测试 - 获取 InvalidCastException - 为什么?以及如何解决?
【发布时间】:2018-04-30 08:03:42
【问题描述】:

我在 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)

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

【问题讨论】:

  • 尝试使用 Unity Test Runner 而不是通过 Resharper/Rider/VS 运行它们。
  • @EvilTak 是我尝试的第一件事,但为了安全起见又做了一次。它给了我几乎相同的例外;修剪与 ReSharper 的 NUnit 运行器相关的几行。有什么区别呢?以前都工作过。
  • 您正在编译哪个版本的 NUnit 框架 - v2 或 v3?
  • @Chris Unity 2017 的...我相信它是 V3 或“V3 等效”。

标签: unit-testing exception unity3d nunit


【解决方案1】:

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 方面提供任何帮助。

【讨论】:

  • 那会很奇怪,因为我能够在没有任何问题的情况下进行单元测试,然后它突然开始将测试报告为不确定并给出异常。但是我在编程中看到了足够多的怪异 s___,几乎从不放弃这种可能性;特别是当我没有其他线索时。我会尝试适配器,如果失败,基​​于提示的其他一些东西,并会尽快报告。现在,在这里,有一个 cookie (+1)。 =)
  • 是的...那行不通。无论问题是什么,我不认为是版本不匹配,因为 1) 单元测试曾经有效。 2)似乎没有其他人遇到这个问题(如果确实是这样的版本不匹配,我希望它会全部发生)。 3) 测试适配器不工作;我仍然得到完全相同的异常。
  • 确实很奇怪。这是我可以告诉你的... 1) 缺少的接口方法仅由作为引擎一部分的 NUnit v3 驱动程序使用 2) 该接口和方法在某些平台上不可用。你的测试平台是什么?
  • 我正在 PC(Windows 10 64 位)上进行测试,并尝试了独立(Windows)和 android 的部署设置。两者都失败了例外。我不确定在单元测试工作时我拥有哪个部署平台(至少一个工作;可能/可能两者都工作),但我认为它应该/通常在两者上都工作,因为我没有看到任何其他 Unity3D 开发人员遇到这个问题。
  • 顺便说一句:我格式化了我的电脑并从头开始重新安装了统一,所以看看这是否能以某种方式解决问题......它没有......所以现在我对出了什么问题更加一无所知。我开始变得偏执,并认为 Unity 2017.* 版本(与 Unity 5.6.4.*f3 相反——我可以肯定记得单元测试工作的最后一个版本)已经损坏/错误单元测试/NUnit .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多