ShimNotSupportedException в MS VisualStudio 2012
Я просто пытаюсь ознакомиться с новой платформой Fakes Isolation Framework в Visual Studio 2012 RC, но, следовательно, у меня возникают проблемы сShimNotSupportedException
s.
С первых попыток, каждый метод подкладки, к которому я пытался подключить делегата, бросал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);
}
}
Это соответствующая трассировка стека:
The GetFoo_ValidBar_ReturnsBaz test method has thrown an exception: Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException: System.DateTime at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent(T value, Action1 eh) at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod(MethodBase method) at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation(MethodBase method) at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour(Object optionalReceiver, MethodBase method, Delegate detourDelegate) at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver, MethodBase method, Delegate detourDelegate) at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub, Object optionalReceiver, MethodBase method) at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub, Type receiverType, Object optionalReceiver, String name, ShimBinding flags, Type returnType, Type[] parameterTypes) at 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: line 48.
Прочитав два потока, которые я обнаружил на MSDN, посвященных этой проблеме, я последовал их инструкциям (отключение CodeCoverage, удаление файла .testsettings), который не работал для меня!
Тем не менее я нашел обходной путь для этой проблемы:
Сначала запустив все тесты из Test Explorer (вместо того, чтобы использовать кнопку «MSTest Test (нажмите для запуска)» непосредственно из области кодирования), все работало правильно, и исключений не было. После этого я мог даже отладить тест, и назначение метода shim работало так, как ожидалось.
Это работало для всех следующих прокладок, которые я использовал.
Но теперь у меня снова возникает та же проблема при попытке реализовать подделки библиотеки MS Enterprise для доступа к базе данных.
Вот как выглядит тест:
[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);
}
}
Первые два назначения shim (ShimFoo & ShimQux) работают как положено. Но ShimDatabaseFactory.CreateDatabaseString (который должен заставить DatabaseFactory.CreateDatabase (string) возвращать заглушку базы данных при попытке создать новый экземпляр базы данных) снова генерирует исключение ShimNotSupportedException. И я просто не могу понять, почему!
У вас есть идеи, что здесь пошло не так?
Буду признателен за любой вклад по этому вопросу.
Спасибо,
Вениамин