Zwracana wartość, która została przekazana do metody


390

Mam metodę interfejsu:

string DoSomething(string whatever);

Chcę się z tego wyśmiewać za pomocą MOQ, aby zwracało to, co zostało przekazane - coś w stylu:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

Jakieś pomysły?

Odpowiedzi:


525

Możesz użyć lambda z parametrem wejściowym, na przykład:

.Returns((string myval) => { return myval; });

Lub nieco bardziej czytelny:

.Returns<string>(x => x);

1
Wydaje się dość proste, dopóki nie trzeba to zrobić za pomocą metody z 7 argumentów ... Kiedy kontrolowane IReturnsw Min definiuje Returnsdla 4 argumenty co najwyżej . Jakiś prosty sposób obejść ten problem? / Mam na myśli oprócz modyfikowania źródła Moq /
— mizuki nakeshu

14
ok, jest zdefiniowany dla maksymalnie 9 argumentów w Moqv 4.0.0.0. rozwiązane :)
— mizuki nakeshu

14
@mizukinakeshu Zastanowiłbym się nad refaktorem metody 9-argumentowej, ponieważ wydaje się, że klasa / metoda robi zbyt wiele. Być może przekształciłeś 9 parametrów w klasę ustawień lub strukturę, aby ci pomóc później?
— Senator

@ TheSenator Zgadzam się, jeszcze nie przypominam sobie o co chodziło, ale chyba właśnie zhakowałem kilka testów jednostkowych dla już istniejącego kodu, którego nie miałem modyfikować, w przeciwnym razie ta liczba argumentów zdecydowanie wymaga refaktoryzacji.
— mizuki nakeshu

27
Tylko uwaga, która mnie pomyliła: ciąg w .Returns<string>odnosi się do parametrów wejściowych, a nie do wartości, które zwracasz.
— Jim

241

Nawet bardziej przydatne, jeśli masz wiele parametrów, możesz uzyskać dostęp do dowolnego / wszystkich z nich za pomocą:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

Zawsze musisz odwoływać się do wszystkich argumentów, aby dopasować podpis metody, nawet jeśli zamierzasz użyć tylko jednego z nich.


17
To powinna być zaakceptowana odpowiedź. Właśnie to musisz zrobić. Wszystko inne generuje wyjątek „liczba oczekiwanych argumentów”.
— Chaim Eliyah

Tak, zdecydowanie łatwiej jest je czytać i ReturnsAsyncteż z nimi współpracuje !
— Piotr Kula

1
Ta odpowiedź uratowała dzień. Uwaga (przyszli czytelnicy), możesz pójść o krok dalej. .Returns ((ciąg a, ciąg b, ciąg c) => {ciąg d = "wow"; zwraca ciąg.Concat (a, b, c, d);});
— granadaCoder,

1
Osobiście jest to znacznie lepsza odpowiedź. Mam bardzo małą wiedzę na temat Moq, ale wciąż zrozumiałem to od razu.
— unrealsoul007

Do metod zwracających void użyłem .Callback ((ciąg a, wyjątek b, ciąg c) => wyrzuć nowy wyjątek (b. Komunikat));
— tymtam,

62

Metoda ogólna Returns<T>ładnie poradzi sobie z tą sytuacją.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

Lub jeśli metoda wymaga wielu danych wejściowych, określ je w następujący sposób:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.