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