【问题标题】:Faking a method results in "incompatible method and shim" exception伪造方法会导致“方法和垫片不兼容”异常
【发布时间】:2015-07-13 21:06:35
【问题描述】:

我在 VS 2013 Premium 中使用 Shims and Fakes。在为所有实例填充方法时,我在运行时收到错误“方法和填充程序不兼容”。编译不提供任何错误指示。

有问题的代码:

ShimViewModelBase.AllInstances.GetQueryCriteriaFromUriNavigationContext = (T, C) => { return new List<QueryCriteria>(); };

感谢您提供的任何见解。

根据要求,这是我尝试填充的方法定义。

 public List<QueryCriteria> GetQueryCriteriaFromUri(NavigationContext inContext);

完全错误:

An exception of type 'System.ArgumentException' occurred in Microsoft.QualityTools.Testing.Fakes.dll but was not handled in user code

Additional information: incompatible method and shim

堆栈跟踪:

   at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver, MethodBase method, Delegate detourDelegate)
   at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub, Object optionalReceiver, MethodBase method)
   at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub, Type receiverType, Object optionalReceiver, String name, ShimBinding flags, Type returnType, Type[] parameterTypes)
   at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimPublicInstance(Delegate optionalStub, Type receiverType, Object optionalReceiver, String name, Type returnType, Type[] parameterTypes)
   at Infrastructure.Fakes.ShimViewModelBase.AllInstances.set_GetQueryCriteriaFromUriNavigationContext(Func`3 value)
   at MaterialTracking.UI.Module.Tests.NotificationsListViewModelTests.OnNavigatedToTest() in c:\CodeCoverage\Material Tracking\MaterialTracking.UI.UnitTests\Views\NotificationsListView\NotificationsListViewModelTests.cs:line 65

我也试过了

  ShimViewModelBase sBaseViewModel = new ShimViewModelBase((ViewModelBase)notificationsListViewModel);
            sBaseViewModel.GetQueryCriteriaFromUriNavigationContext = (T) => { return new List<QueryCriteria>(); };

【问题讨论】:

  • 我编辑了提供的代码以包含请求的内容
  • 你能分享更多关于ViewModelBase类的信息吗?它是一个抽象类吗?内部班?它来自一个框架吗?它是您项目的自定义类吗?您是否有一个显示问题的最小项目?
  • ViewModelBase 是我公司编写的框架的一部分。它是一个抽象类。它有一个基类并实现了一些接口。我没有最小的项目,因为如果不使用框架,我无法在另一个项目中重现它。
  • 我也有同样的问题。我怀疑这是导致问题的继承树。如果是抽象基类,您是否尝试过在实现上设置 shim?
  • 该方法不适用于实现类上的 Shimming,因为它使用抽象类中定义的实现。

标签: c# microsoft-fakes shim


【解决方案1】:

您遇到此问题是因为产品 dll 与相应的假货 dll 不匹配。很有可能在您的产品代码中,函数“public List GetQueryCriteriaFromUri(NavigationContext inContext)”的签名已更改,但相应的 fakes dll 仍然很旧。创建与更新的产品 dll 对应的 fakes dll 并尝试运行测试。希望它会有所帮助。

【讨论】:

  • 感谢您的指点。看起来在运行时,它正在从 GAC 中提取不同版本的类,而在编译期间它使用本地 dll 和更新的类。
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 2012-12-28
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多