Повертається значення, передане в метод


390

У мене є метод на інтерфейсі:

string DoSomething(string whatever);

Я хочу знущатися над цим MOQ, щоб він повертав все, що було передано - щось на зразок:

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

Будь-які ідеї?

Відповіді:


525

Ви можете використовувати лямбда з вхідним параметром, наприклад:

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

Або трохи читабельніше:

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

1
Здається , досить легко , поки ви не повинні робити це для методу з 7 аргументів ... Коли я оглянув IReturnsу Moq, він визначає Returnsдля 4 аргументів в більшості . Будь-який простий спосіб обійти це? / Я маю на увазі, крім модифікації джерела
Moq

14
добре, він визначається для до 9 аргументів в Moqv 4.0.0.0. вирішено :)
mizuki nakeshu

14
@mizukinakeshu Я б розглядав трохи рефактора за методом 9 аргументів, оскільки це здається, що клас / метод робить занадто багато. Можливо, перефактуруйте 9 параметрів у клас налаштувань або структуру, щоб пізніше вам допомогти?
Сенатор

@ TheSenator Погодьтеся, я не переосмислюю вже про що це було, але, мабуть, я просто зламав кілька тестів одиниці для вже існуючого коду, який я не міг змінювати, інакше ця кількість аргументів, безумовно, вимагає рефакторингу.
mizuki nakeshu

27
Лише зауваження, як це бентежило мене: рядок у .Returns<string>посилається на вхідні параметри, а не на значення, які ви повертаєте.
Джим

241

Ще корисніше, якщо у вас є кілька параметрів, ви можете отримати доступ до будь-якого / всіх з них за допомогою:

_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));

Вам завжди потрібно посилатися на всі аргументи, щоб відповідати підпису методу, навіть якщо ви збираєтесь використовувати лише один з них.


17
Це має бути прийнятою відповіддю. Це саме те, що вам потрібно зробити. Все, що викидає, виключає "кількість очікуваних аргументів".
Хаїм Елія

Так, безумовно, виділіть простіше для читання і з ним ReturnsAsyncтеж працювати!
Пьотр Кула

1
Ця відповідь врятувала день. Зауважте (майбутні читачі), ви можете взяти це ще трохи. .Returns ((рядок a, рядок b, рядок c) => {рядок d = "wow"; повернути string.Concat (a, b, c, d);});
granadaCoder

1
Особисто це набагато краща відповідь. Я дуже мало знаю про Мок, але все ж зрозумів це негайно.
undealsoul007

Для методів повернення void я використав .Callback ((рядок a, Виняток b, рядок c) => кинути новий виняток (b.Message));
tymtam

62

Загальний Returns<T>метод може чудово впоратися з цією ситуацією.

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

Або якщо метод вимагає декількох входів, вкажіть їх так:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.