SetupSequence в Moq
Я хочу, чтобы mock возвратил 0 в первый раз, а затем возвращает 1 в любое время, когда был вызван метод. Проблема в том, что если метод вызывается 4 раза, я должен написать, что:
mock.SetupSequence(x => x.GetNumber())
.Returns(0)
.Returns(1)
.Returns(1)
.Returns(1);
иначе метод возвращает null.
Можно ли написать, что в следующий раз, когда метод был вызван после первого раза, метод возвращает 1?
Спасибо вам
Хорошо ли иметь больше "операторов" для SetupSequence? Если вы считаете ДА, вы можете проголосовать:
http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators
Ответы
Ответ 1
Это не особенно интересно, но я думаю, что это сработает:
var firstTime = true;
mock.Setup(x => x.GetNumber())
.Returns(()=>
{
if(!firstTime)
return 1;
firstTime = false;
return 0;
});
Ответ 2
Самый чистый способ - создать метод Queue
и передать .Dequeue
на Returns
.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);
Ответ 3
Вы можете использовать временную переменную, чтобы отслеживать, сколько раз был вызван метод.
Пример:
public interface ITest
{ Int32 GetNumber(); }
static class Program
{
static void Main()
{
var a = new Mock<ITest>();
var f = 0;
a.Setup(x => x.GetNumber()).Returns(() => f++ == 0 ? 0 : 1);
Debug.Assert(a.Object.GetNumber() == 0);
for (var i = 0; i<100; i++)
Debug.Assert(a.Object.GetNumber() == 1);
}
}
Ответ 4
Просто настройте метод расширения, например:
public static T Denqueue<T>(this Queue<T> queue)
{
var item = queue.Dequeue();
queue.Enqueue(item);
return item;
}
И затем настройте return как:
var queue = new Queue<int>(new []{0, 1, 1, 1});
mock.Setup(m => m.GetNumber).Returns(queue.Denqueue);