ShimNotSupportedException w MS VisualStudio 2012
Staram się tylko zapoznać z nowym Fakes Isolation Framework w Visual Studio 2012 RC, ale konsekwentnie stykam się z problemamiShimNotSupportedException
s.
Przy pierwszych próbach każda pojedyncza metoda, którą próbowałem przyłączyć delegatowi, rzuciłaShimNotSupportedException
podczas próby uruchomienia / debugowania testu.
[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);
}
}
Jest to odpowiedni ślad stosu:
Metoda testowa GetFoo_ValidBar_ReturnsBaz zgłosiła wyjątek: Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException: System.DateTime w Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InvokeEvent (wartość T, Action1 eh) w Microsoft.QualityTools. Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.OnAttachedUnsupportedMethod (metoda MethodBase) w Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.CheckInstrumentation (metoda MethodBase) w Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.InternalAttachTestIsolation.UnitTestIsolationRuntime.InternalAttachDetour.UnitTestIsolationRuntime.InternalAttachDetour (Object opcjonalnyReceime.InternalAttachDetour (Object opcjonalny) metoda, Delegate detourDelegate) w Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour (Obiekt opcjonalny Odbiorca, metoda MethodBase, Delegate detourDelegate) w Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod (Delegat opcjonalny Stub, Object opcjonalny Odbiorca, Metoda MethodBase) w Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim (Deleguj opcjonalny Podpisz, Wpisz receiverType, Obiekt opcjonalny Odbiorca, Nazwa łańcucha, Flagi ShimBinding, Wpisz returnType, Wpisz [] parametrTyps) w Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime .SetShimPublicStatic (Deleguj opcjonalny stub, wpisz receiverType, String name, Wpisz returnType, Type [] parameterTypes) w System.Fakes.ShimDateTime.set_NowGet (wartość Func'1) w GetFoo_ValidBar_ReturnsBaz () w BazTests.cs: linia 48.
Po przeczytaniu dwóch wątków, które znalazłem w MSDN zajmujących się tym problemem, zastosowałem się do ich instrukcji (wyłączając CodeCoverage, usuwając plik .testsettings), który nie działał dla mnie!
Niemniej jednak znalazłem obejście tego problemu:
Najpierw uruchamiając wszystkie testy z Eksploratora testów (zamiast używać przycisku „Test MSTest (kliknij, aby uruchomić)” bezpośrednio z obszaru kodowania) wszystko działało poprawnie i nie zgłaszano żadnych wyjątków. Potem mogłem nawet debugować test, a przypisanie do metody shim zadziałało zgodnie z oczekiwaniami.
Dotyczyło to również wszystkich następnych podkładek, których użyłem.
Ale teraz znowu mam ten sam problem, próbując zaimplementować podróbki biblioteki MS Enterprise do dostępu do bazy danych.
Oto jak wygląda test:
[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);
}
}
Pierwsze dwa zadania shim (ShimFoo i ShimQux) działają zgodnie z oczekiwaniami. Ale ShimDatabaseFactory.CreateDatabaseString (który ma spowodować, że DatabaseFactory.CreateDatabase (string) zwróci bazę danych stub podczas próby utworzenia nowej instancji bazy danych) ponownie wyrzuca ShimNotSupportedException. I po prostu nie mogę zrozumieć dlaczego!
Czy masz jakieś pomysły, co poszło nie tak?
Byłbym wdzięczny za wszelkie uwagi na ten temat.
Dzięki,
Benzoes