Moq w Universal Apps? Zapomnij!
Jeżeli chcielibyście użyć znanego Wam framework do moqowania obiektów, zapomnijcie.
Do takich konkluzji doszedłem podczas mojej kolejnej “zabawy” z projektem, który mam w głowie i powoli przenoszę go do świata żywego (nie ważne)
Ale po kolei. Ważną rzeczą, na którą musicie zwrócić uwagę przy dodawaniu projektu unit test do to wybranie Unit Test App (Universal Windows)
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172607″]
Trochę się zdziwiłem, że w wygenerowanych plikach do unit testów zobaczyłem xaml’a 🙂
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172608″]
No cóż… do różnych dziwnych rzeczy jestem przyzwyczajony
Pierwsze co chciałem zrobić to dodać nUnit do projektu, który z nugeta bez najmniejszego problemu dodałem. Piszę na szybko pierwszy test
1 2 3 4 5 6 7 8 9 10 |
[TestFixture] public class MainViewModelTest { [Test] public void FirstTest() { bool a = true; Assert.IsTrue(a); } } |
Uruchamiam testy z Resharpera i za chwilę pokazuje mi się takie coś
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172609″]
Kto tu jest nieprzekonywujący? Ja czy mój test? 😀
Przeszukałem, przegrzebałem Internet 3 razy i znalazłem odpowiedź. Odpuściłem. Nie będę walić głową w mur. Jest MSTest, z którego też mogę korzystać.
Szybka zmiana atrybutów w mojej testowej klasie
1 2 3 4 5 6 7 8 9 10 |
[TestClass] public class MainViewModelTest { [TestMethod] public void FirstTest() { bool a = true; Assert.IsTrue(a); } } |
I wynik już całkowicie inny
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172613″]
Super!
Więc kolejną rzeczą jaką chciałem dodać to Moq. Włączam nuget, szukam, instaluje i dostaję coś takiego
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172614″]
Natomiast w output czytam, że moq nie jest kompatybilny z UAP w wersji 10
[onedrivefile id=”file.d569b1679fa79aae.d569b1679fa79aae!172615″]
Zajebiście… Zacząłem znowu grzebać i wygrzebałem kilka rzeczy. Po pierwsze na stronach uservoice jest prośba o dodanie moq’ów do Universal Apps… czyli jesteśmy w czarnej d..pie!
Ale podczas szukania znalazłem jedną rzecz. Sugestia aby użyć DispatchProxy.
Przyglądnąłem się temu co Microsoft zamieścił na github i zacząłem to rozwiązanie implementować w swoim projekcie.
Na samym początku potrzebna jest klasa, która dziedziczy po DispatchProxy
1 2 3 4 5 6 7 8 9 10 11 12 |
public class TestDispatchProxy : DispatchProxy { // Gets or sets the Action to invoke when clients call methods on the proxy. public Func<MethodInfo, object[], object> CallOnInvoke { get; set; } // Implementation of DispatchProxy.Invoke() just calls back to given Action protected override object Invoke(MethodInfo targetMethod, object[] args) { return CallOnInvoke(targetMethod, args); } } |
Następnie w metodach testowych możemy to wykorzystać między innymi w ten sposób
1 2 3 4 5 6 7 |
[TestMethod] public void TestMethod1() { IMainViewModel a = DispatchProxy.Create<IMainViewModel, TestDispatchProxy>(); ((TestDispatchProxy)a).CallOnInvoke = (method, args) => true; Assert.IsTrue(a.Test()); } |
I o dziwo to działa.
Ale jak dla mnie?
Kolejna porażka Microsoft!
Masakra… Tak pompują ten balonik a nie zapewniają nawet podstawowych narzędzi. Bojkot!
Mam cichą nadzieję, że to poprawią
Jak coś Xunit działa bez problemu 😉
Dzięki za info, napewno sprawdzę 🙂