5

私は 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);
    }
} 

これは、対応するスタック トレースです。

GetFoo_ValidBar_ReturnsBaz テスト メソッドが例外をスローしました。 Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase メソッド) Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase メソッド) Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver, MethodBase)メソッド、デリゲート detourDelegate) で Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver,MethodBase メソッド、デリゲート detourDelegate) の Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(デリゲート optionalStub、オブジェクト optionalReceiver、MethodBase メソッド) Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(デリゲート optionalStub、タイプ receiverType 、オブジェクト optionalReceiver、文字列名、ShimBinding フラグ、型 returnType、Type[] parameterTypes) Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimPublicStatic (デリゲート optionalStub、型 receiverType、文字列名、型 returnType、Type[] parameterTypes) BazTests.cs の GetFoo_ValidBar_ReturnsBaz() で System.Fakes.ShimDateTime.set_NowGet(Func'1 value): 48 行目。MethodBase メソッド) の Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim (デリゲート optionalStub、Type receiverType、Object optionalReceiver、String name、ShimBinding flags、Type returnType、Type[] parameterTypes) Microsoft.QualityTools.Testing.Fakes で。 Shims.ShimRuntime.SetShimPublicStatic(Delegate optionalStub, Type receiverType, String name, Type returnType, Type[] parameterTypes) at System.Fakes.ShimDateTime.set_NowGet(Func'1 value) at GetFoo_ValidBar_ReturnsBaz() in BazTests.cs: 48 行目。MethodBase メソッド) の Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim (デリゲート optionalStub、Type receiverType、Object optionalReceiver、String name、ShimBinding flags、Type returnType、Type[] parameterTypes) Microsoft.QualityTools.Testing.Fakes で。 Shims.ShimRuntime.SetShimPublicStatic(Delegate optionalStub, Type receiverType, String name, Type returnType, Type[] parameterTypes) at System.Fakes.ShimDateTime.set_NowGet(Func'1 value) at GetFoo_ValidBar_ReturnsBaz() in BazTests.cs: 48 行目。BazTests.cs の GetFoo_ValidBar_ReturnsBaz() の System.Fakes.ShimDateTime.set_NowGet(Func'1 value) で、receiverType、String name、Type returnType、Type[] parameterTypes) を入力します: 48 行目。BazTests.cs の GetFoo_ValidBar_ReturnsBaz() の System.Fakes.ShimDateTime.set_NowGet(Func'1 value) で、receiverType、String name、Type returnType、Type[] parameterTypes) を入力します: 48 行目。

この問題を扱っている MSDN で見つけた 2 つのスレッドを読んだ後、彼らの指示 (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);
    }
}

最初の 2 つの shim 割り当て (ShimFoo と ShimQux) は期待どおりに機能しています。しかし、ShimDatabaseFactory.CreateDatabaseString (新しいデータベース インスタンスを作成しようとすると、DatabaseFactory.CreateDatabase(string) がスタブ データベースを返すようにするはずです) は、ShimNotSupportedException を再度スローします。そして、私はその理由を理解できません!
ここで何がうまくいかなかったのか、何か考えはありますか?

これに関するご意見をいただければ幸いです。

ありがとう、
ベンジャミン

4

3 に答える 3

4

私はまったく同じ問題を抱えていました。すべての testsettings ファイルを (ディスクとソリューションの両方から) 削除し、ソリューションが testsettings ファイルを参照していないことを確認してください。

また、ビジュアルスタジオのテストランナーを使用していることを確認してください(コードをインストルメント化するリシャーパーなどではありません)。

これらの問題について、役に立つかもしれない 2 つのブログ投稿を書きました。

Visual Studio 2012 Fakes – テストのデバッグ時の ShimNotSupportedException

単体テスト – Team City での Visual Studio 2012 Fakes

于 2012-09-13T11:24:20.717 に答える
1

問題はテスト設定に関連しています。以下のリンクが示唆していることを実行しましたが、多くの可能な解決策を試した後、最終的に機能しました

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

于 2014-05-07T18:53:18.170 に答える