MS VisualStudio 2012中的ShimNotSupportedException

Ben*_*Sch 5 c# shim isolation visual-studio microsoft-fakes

我只是想熟悉Visual Studio 2012 RC中新的Fakes Isolation Framework,但我因此面临着ShimNotSupportedExceptions的问题.
在第一次尝试时,我尝试连接一个委托的每个单一的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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

这是相应的堆栈跟踪:

GetFoo_ValidBar_ReturnsBaz测试方法抛出了一个异常: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.UnitsTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase方法)方法,委托detourDelegate)Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase方法,Delegate detourDelegate)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub,Object optionalReceiver, MethodBase方法)在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime的Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub,Type receiverType,Object optionalReceiver,String name,ShimBinding flags,Type returnType,Type [] parameterTypes) .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测试(点击运行)"按钮)一切正常,没有抛出任何异常.之后我甚至可以调试测试,并且对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<BarInformation> actual = accessor.InvokeStatic("GetBar",
                                                                new Object[] { }) as List<BarInformation>;
        Assert.IsTrue(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我将不胜感激.

谢谢,
本杰明

Njå*_*aug 4

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

\n\n

还要确保您使用的是 Visual Studio Testrunner(而不是正在检测代码的 resharper 等)。

\n\n

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

\n\n

调试测试时 Visual Studio 2012 伪造 \xe2\x80\x93 ShimNotSupportedException

\n\n

Team City 中的单元测试 \xe2\x80\x93 Visual Studio 2012 假货

\n