簡體   English   中英

MS VisualStudio 2012中的ShimNotSupportedException

[英]ShimNotSupportedException in MS VisualStudio 2012

我只是想熟悉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測試方法引發了一個異常:Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException:Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeTools中的System.DateTime。 Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase方法),位於Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.DeTest.Fakes.UnitTestIsolationRun(。 Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate) MethodBase方法) 在Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime(Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub,Type receiverType,Object optionalReceiver,字符串名稱,ShimBinding標志,類型returnType,Type [] parameterTypes) .SetShimPublicStatic(在System.Fakes.ShimDateTime.set_NowGet(Func'1值)處在BazTests.cs的48行上的GetFoo_ValidBar_ReturnsBaz()處刪除委托的Stub,類型接收器類型,字符串名稱,類型returnType,類型[] parameterTypes)。

讀完我在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);
    }
}

前兩個墊片分配(ShimFoo和ShimQux)按預期工作。 但是ShimDatabaseFactory.CreateDatabaseString(在嘗試創建新的數據庫實例時,應該使DatabaseFactory.CreateDatabase(string)返回存根數據庫)再次引發ShimNotSupportedException。 而且我不知道為什么!
您有什么想法這里出了什么問題嗎?

我對此表示感謝。

謝謝,
本傑明

我有同樣的問題。 嘗試刪除所有測試設置文件(從磁盤和解決方案中刪除),並確保您的解決方案未引用任何測試設置文件。

另外,請確保您使用的是Visual Studio Testrunner(而不是重新測試代碼的reshaper等)。

我寫了兩個關於這些問題的博客,可能會有所幫助:

Visual Studio 2012偽造–調試測試時出現ShimNotSupportedException

單元測試– 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM