UnitTest Moq, PluginManager.Initialize() prawdopodobnie nie działa

0

Siema

Testuję jedną z metod która wyrzuca ArgumentNullException z nazwą parametru „source”. Debugując metodę testu jednostkowego dochodze po Call Stacku do metody statycznej PluginFinder.EnsurePluginsAreLoaded()

user image

Exception powoduje właściwość ReferencedPlugins, która jest null (chyba że źle rozumiem „jest zerowa” dla typu referencyjnego?)
Oto winowajca
user image

Właściwość PluginManager.ReferencedPlugins jest tylko w jednym miejscu inicjalizowana, w metodzie statycznej Initialize() (bezparametrowej). Wewnątrz metody Initialize() jest jedna duża pętla z wieloma warunkami, ale zakładam że działa ona ok, więc dochodze do linijki w której do tymczasowego obiektu (typu List<PluginDescriptor>) dodawane są (Add()) kolejne obiekty

user image

Później do Własciwości przypisywany jest ten obiekt.
Problem w tym, że przy wywołaniu metody .ToList() wywala Exceptiona – metoda ta stwierdza, że przesłany argument („source”) jest null (?). Rozumiem, że nie chodzi o to, czy są jakieś obiekty – może ich nie być, tylko że referencja nie ma przypisanego obiektu (referencedPlugins = new List<PluginDescriptor>();)

Ergo dochodzę do wniosku, że metoda statyczna Initialize() nie jest w ogóle wywoływana.
Tutaj wpadam na głupi pomysł wywołania tej metody w TestInitialize() (taka metoda testów jednostkowych, która odpala się przed wszystkimi innymi UnitTest’ami)

user image

Co tylko powoduje wywalenie innego Exceptiona, co jak rozumiem, jest głupim sposobem i drogą donikąd.
Będę wdzięczny za nakierowanie gdzie szukać lub bezpośrednią odpowiedź co jest źle (projekt jest napisany w ASP.NET MVC, chyba jedna z nowszych wersji).
Podobno projekt działa jak najbardziej ok (pomijając testy – które piszę w ramach zapoznania się z projektem). Do tworzenia Mocków używam Moq (chociaż RhinoMock tez daje radę).

0

Ja bym szukała u osoby (programisty), która twierdzi, że projekt działa jak najbardziej ok. Mówisz, że zapoznajesz się z projektem - w takim razie chyba masz opiekuna, którego możesz zapytać. Zwłaszcza że wykonałeś ważny krok wstępnego prześledzenia stosu i dojścia do jakiegoś wniosku. Nam tutaj trudno coś powiedzieć, bo nie znamy Twojej aplikacji i nie wiemy, jakie to ma znaczenie, że metoda Initialize() nie jest wywoływana albo jak prawidłowo ją wywołać.

Co tylko powoduje wywalenie innego Exceptiona, co jak rozumiem, jest głupim sposobem i drogą donikąd.
Niekoniecznie - zależy, jaki to wyjątek. Może też trzeba trochę pogrzebać i poszukać przyczyny?

0

Czym jest PluginManager? To jakaś publicznie dostępna biblioteka czy Wasz kod?
Jeśli działanie tej klasy wymaga najpierw zawołanie Initialize, to znaczy, że aplikacja to robi (jeśli działa), więc i w testach trzeba to zrobić.
Tak czy siak, pokazałeś za mało kodu.

0

@somekind

user image

Wewnątrz PluginManager jest metoda statyczna Initialize()

Myślę, że to dużo wyjaśni. PreApplicationStartMethod jak nazwa wskazuje jest czymś co chyba w domyśle odpala metodę Initialize() (która ma się odpalić przed odpaleniem aplikacji). Wewnątrz niej jak już pisałem, inicjalizowana jest Właściwość ReferencedPlugins, która wyrzuca Exceptiona ArgumentNullException.

Nie siedzę długo w asp.net mvc i nie mam pojęcia dokładnie jak to działa. Wystarczy mi nakierowanie, jaką wiedzę muszę zdobyć aby sobie z tym poradzić. Chcę >>w jakiś sposób<< odpalić tą metodę w poprawny sposób, aby Właściwość ReferencedPlugins nie wyrzucała exceptiona - bo chce przestestować pewne metody w testach jednostkowych (jak już wcześniej pisałem, jeżeli odpalę ręcznie PluginManager.Initialize() to wyrzuca inny Exception - ergo nie tędy droga).

Tak przy okazji byłbym wdzięczny za jakiś kompletny tutorial wyjaśniający czym jest to coś pomiędzy nawiasami kwadratowymi [] - wielokrotnie z tego korzystałem, ale nie mam idei czym to "fizycznie" jest i gdzie mogę zobaczyć co to robi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1