私は Visual Studio 2012 RC の新しい Fakes Isolation Framework に慣れようとしていますが、結果としてShimNotSupportedException
s の問題に直面しています。
最初の試行で、デリゲートを接続しようとした各単一の 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 を再度スローします。そして、私はその理由を理解できません!
ここで何がうまくいかなかったのか、何か考えはありますか?
これに関するご意見をいただければ幸いです。
ありがとう、
ベンジャミン