Подтвердить что ты не робот

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

4b9b3361

Ответ 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);