Czy można przypisać parametr out
/ ref
przy użyciu Moq (3.0+)?
Patrzyłem na używanie Callback()
, ale Action<>
nie obsługuje parametrów ref, ponieważ jest oparty na ogólnych. Wolałbym również umieścić ograniczenie ( It.Is
) na wejściu ref
parametru, chociaż mogę to zrobić w wywołaniu zwrotnym.
Wiem, że Rhino Mocks obsługuje tę funkcję, ale projekt, nad którym pracuję, już korzysta z Moq.
It.IsAny<T>()
podobnego matcher (ref It.Ref<T>.IsAny
) do obsługi konfiguracji.Callback()
i.Returns()
poprzez niestandardowe typy delegatów pasujące do sygnatury metody. Metody chronione są w równym stopniu obsługiwane. Zobacz np. Moją odpowiedź poniżej .Odpowiedzi:
Moq wersja 4.8 (lub nowsza) ma znacznie ulepszoną obsługę parametrów by-ref:
Ten sam wzór działa dla
out
parametrów.It.Ref<T>.IsAny
działa również dla C # 7in
parametrów (ponieważ są one również referencjami).źródło
out
, prawda?W przypadku „out” wydaje mi się, że następujące elementy działają.
Zgaduję, że Moq sprawdza wartość „oczekiwanej wartości”, gdy wywołujesz Instalatora i zapamiętuje ją.
Dla
ref
szukam też odpowiedzi.Przydatny jest następujący przewodnik Szybki start: https://github.com/Moq/moq4/wiki/Quickstart
źródło
Setup
EDYCJA : W Moq 4.10 możesz teraz przekazać delegata, który ma parametr out lub ref bezpośrednio do funkcji Callback:
Będziesz musiał zdefiniować delegata i utworzyć go:
Dla wersji Moq przed 4.10:
Avner Kashtan udostępnia na swoim blogu metodę rozszerzenia, która pozwala ustawić parametr wyjściowy z wywołania zwrotnego: Moq, Callback i parametry Out: szczególnie trudny przypadek krawędzi
Rozwiązanie jest zarówno eleganckie, jak i zuchwałe. Elegancki, ponieważ zapewnia płynną składnię, która sprawia wrażenie domowej z innymi wywołaniami zwrotnymi Moq. I hacky, ponieważ polega na wywołaniu niektórych wewnętrznych interfejsów API Moq poprzez refleksję.
Metoda rozszerzenia podana w powyższym linku nie została dla mnie skompilowana, dlatego podałem poniżej wersję edytowaną. Musisz utworzyć podpis dla każdej liczby parametrów wejściowych, które masz; Podałem 0 i 1, ale dalsze rozszerzenie powinno być proste:
Dzięki powyższej metodzie rozszerzenia możesz przetestować interfejs bez parametrów, takich jak:
.. z następującą konfiguracją Moq:
Edycja : Aby obsługiwać metody void-return, wystarczy dodać nowe metody przeciążenia:
Umożliwia to testowanie interfejsów takich jak:
źródło
var methodCall = mock.GetType().GetProperty("Setup").GetValue(mock); mock.GetType().Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackResponse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, methodCall, new[] { action });
mock.Setup(x=>x.Method(out d)).Callback(myDelegate).Returns(...);
Musisz zdefiniować delegata i utworzyć go:...Callback(new MyDelegate((out decimal v)=>v=12m))...;
To jest dokumentacja ze strony Moq :
źródło
Wydaje się, że nie jest to możliwe po wyjęciu z pudełka. Wygląda na to, że ktoś próbował rozwiązać problem
Zobacz ten post na forum http://code.google.com/p/moq/issues/detail?id=176
to pytanie Zweryfikuj wartość parametru odniesienia za pomocą Moq
źródło
Aby zwrócić wartość wraz z ustawieniem parametru ref, oto fragment kodu:
Następnie zadeklaruj własnego delegata pasującego do podpisu metody, która ma być wyśmiewana i podaj własną implementację metody.
źródło
Opierając się na programie Billy Jakes, stworzyłem w pełni dynamiczną próbną metodę z parametrem out. Zamieszczam to tutaj dla każdego, kto uzna to za przydatne (prawdopodobnie tylko mnie w przyszłości).
źródło
Jestem pewien, że rozwiązanie Scotta zadziałało w pewnym momencie,
Ale to dobry argument za tym, by nie używać refleksji do podglądania prywatnych apis. Teraz jest zepsute.
Byłem w stanie ustawić parametry za pomocą delegata
źródło
To może być rozwiązanie.
źródło
Zmagałem się z wieloma sugestiami tutaj, zanim po prostu utworzyłem instancję nowej „fałszywej” klasy, która implementuje interfejs, który próbujesz wyszydzić. Następnie możesz po prostu ustawić wartość parametru out za pomocą samej metody.
źródło
Walczyłem z tym przez godzinę po południu i nigdzie nie mogłem znaleźć odpowiedzi. Po samodzielnej zabawie udało mi się wymyślić rozwiązanie, które działało dla mnie.
Kluczem jest tutaj,
mock.SetupAllProperties();
który usunie wszystkie właściwości dla ciebie. To nie może działać w każdym scenariuszu testowym, ale jeśli wszystko czego dbają o jest uzyskiwaniereturn value
odYourMethod
ówczesnego tej pracy grzywny.źródło