Я просто пытаюсь ознакомиться с новой инфраструктурой изоляции подделок в 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 ), что не сработало для меня!
Тем не менее, я нашел решение этой проблемы:
При первом запуске всех тестов из обозревателя тестов (вместо использования кнопки «MSTest Test (нажмите кнопку для запуска )» непосредственно из области кодирования )все работало правильно, и никаких исключений не возникало. После этого я даже смог отладить тест, и назначение метода прокладки сработало, как и ожидалось.
Это сработало и для всех последующих прокладок, которые я использовал.
Но теперь у меня снова возникает та же проблема, когда я пытаюсь внедрить подделки 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. И я просто не могу понять, почему!
Есть идеи, что здесь пошло не так?
Я был бы признателен за любой вклад в это.
Спасибо,
Бенджамин