MS VisualStudio 2012中的ShimNotSupportedException

我只是想在Visual Studio 2012 RC中熟悉新的Fakes Isolation Framework,但我因此ShimNotSupportedException的问题。
在第一次尝试时,我尝试连接一个委托的每个单一的shim方法,在尝试运行/调试测试时抛出了ShimNotSupportedException

 [TestMethod] public void GetFoo_ValidBar_ReturnsBaz() { using(ShimsContext.Create()) { ShimDateTime.NowGet = () => new DateTime(2012,08,11,10,20,59); const string expected = "20120811_102059"; string actual = GetFoo(); Assert.AreEqual(expected,actual); } } 

这是相应的堆栈跟踪:

GetFoo_ValidBar_ReturnsBaz测试方法抛出了一个exception:Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException:System.DateTime,位于Microsoft.QualityTools的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent(T值,Action1 eh)。 Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver,MethodBase)中的Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase方法)中的Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase方法)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub,Object optionalReceiver,Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase方法,Delegate detourDelegate)上的方法,委托detourDelegate), MethodBase方法) at Microsoft.QualityTools.Testing.Fakes.Sool.ThimRun .SetShimPublicStatic(Delegate optionalStub,Type receiverType,String name,Type returnType,Type [] parameterTypes)在BazTests.cs的GetFoo_ValidBar_ReturnsBaz()的System.Fakes.ShimDateTime.set_NowGet(Func’1值):第48行。

在阅读了我在MSDN上找到的两个线程处理这个问题后,我按照他们的指示(关闭CodeCoverage,删除.testsettings文件),这对我来说不起作用!
不过我找到了解决这个问题的方法:
首先从测试资源管理器运行所有测试(而不是直接从编码区域使用“MSTest测试(单击运行)”按钮)一切正常,没有抛出exception。 之后我甚至可以调试测试,并且对shim方法的赋值也按预期工作。
这适用于我使用的所有后续垫片。
但是现在我在尝试实现MS Enterprise Library的伪造数据库访问时又遇到了同样的问题。

这是测试的样子:

 [TestMethod] public void GetFooFromEF_NonEmptyDataReader_ObjectsCorrectlyInstantiated() { using(ShimsContext.Create()){ var dataReader = new StubIDataReader() { ItemGetString = s => 1, DepthGet = () => 2 }; ShimFoo.GetBar = guid => dataReader; var bar = new StubIBar() { ConvertIBarToBaz = record => null }; ShimQux.AllInstances.GetBar = (a, b) => bar; var dbFactory = new StubDbProviderFactory(); var db = new StubDatabase("test", dbFactory); ShimDatabaseFactory.CreateDatabaseString = s => db; List actual = accessor.InvokeStatic("GetBar", new Object[] { }) as List; Assert.IsTrue(true); } } 

前两个垫片分配(ShimFoo和ShimQux)按预期工作。 但是ShimDatabaseFactory.CreateDatabaseString(它应该使DatabaseFactory.CreateDatabase(string)在尝试创建新数据库实例时返回存根数据库)再次抛出ShimNotSupportedException。 我只是想不通为什么!
你有什么想法吗?

我将不胜感激。

谢谢,
本杰明

我有同样的问题。 尝试删除所有testsettings文件(包括磁盘和解决方案),并确保您的解决方案不引用任何testsettings文件。

还要确保你正在使用visual studio testrunner(而不是resharper等正在使用代码)。

我写过两篇关于这些问题的博文,可能会有所帮助:

Visual Studio 2012 Fakes – 调试测试时ShimNotSupportedException

unit testing – Visual Studio 2012在Team City中失败

我已经多次看到这个错误的原因有很多:

  • 假货生成文件中存在错误或问题,其中一些文件生成不正确。 清理目录并重新制作假参考
  • 缺少依赖的dll。 在这种情况下,你错过了假货dll所依赖的dll。 在一个案例中,我填补了一个Web服务并错过了System.ServiceModel dll。
  • 有时您可以通过更改测试设置默认处理器架构来修复它。 但是我不知道为什么,它可能会刷新一些缓存的dll。

问题与测试设置有关。 我已经完成了以下链接建议,并在尝试了许多可能的解决方案之后终于工作了

http://blog.degree.no/2012/09/visual-studio-2012-fakes-shimnotsupportedexception-when-debugging-tests/