Принятый ответ , а также SetupSequence answer обрабатывает возвращаемые константы.
Returns()
имеет несколько полезных перегрузок, в которых вы можете вернуть значение на основена параметры, которые были отправлены в проверяемый метод.Основываясь на решении , приведенном в принятом ответе, вот еще один метод расширения для этих перегрузок.
public static class MoqExtensions
{
public static IReturnsResult<TMock> ReturnsInOrder<TMock, TResult, T1>(this ISetup<TMock, TResult> setup, params Func<T1, TResult>[] valueFunctions)
where TMock : class
{
var queue = new Queue<Func<T1, TResult>>(valueFunctions);
return setup.Returns<T1>(arg => queue.Dequeue()(arg));
}
}
К сожалению, использование метода требует указания некоторых параметров шаблона, но результатвсе еще вполне читабельно.
repository
.Setup(x => x.GetPageByUrl<IPageModel>(path))
.ReturnsInOrder(new Func<string, IPageModel>[]
{
p => null, // Here, the return value can depend on the path parameter
p => pageModel.Object,
});
Создание перегрузок для метода расширения с несколькими параметрами (T2
, T3
и т. д.), если необходимо.