Moq - Заказанные установки (ожидания) - PullRequest
4 голосов
/ 22 сентября 2009

Я довольно новичок в Moq и не могу понять, как мне заказать настройки. У меня есть следующий код:

_orderRepository.Setup(r => r.Update(It.Is<Order>(a => ((int)a.OrderStatusReference.EntityKey.EntityKeyValues[0].Value) == 2)))
                        .Throws(exception)
                        .AtMost(5);

Я хочу, чтобы это было выполнено 5 раз (логика повторных попыток в случае сбоя обновления). После 5-го раза я хочу настроить и ожидаю, что это успешно (исключение не выдается):

_orderRepository.Setup(r => r.Update(It.Is<Order>(a => ((int)a.OrderStatusReference.EntityKey.EntityKeyValues[0].Value) == 2))).AtMostOnce();

К сожалению, он продолжает использовать первый пример кода и никогда успешно не обновляется.

Если бы я не использовал метод Throws, то я мог бы использовать метод Callback, однако он не доступен после броска: (.

Если есть способ или это ограничение Moq?

Ответы [ 3 ]

16 голосов
/ 30 сентября 2009

Бах ... есть пути!

Вы можете использовать Очередь, чтобы возвратить список возвращаемых значений (стратегия хорошо объяснена здесь: http://haacked.com/archive/2009/09/29/moq-sequences.aspx).

Вот пример из этого блога:

Если вы хотите, чтобы это работало (а это не так):

reader.Setup(r => r.Read()).Returns(true);
reader.Setup(r => r.Read()).Returns(true);
reader.Setup(r => r.Read()).Returns(false);

Просто сделайте это вместо:

Queue listOfOperations = new Queue<bool>(new bool[] { true, true, false });

reader.Setup(r => r.Read())
  .Returns(() => listOfOperations.Dequeue());

Каждый раз, когда вызывается Read (), будет использоваться новое значение из вашей очереди.

Наслаждайтесь!

2 голосов
/ 24 декабря 2012

Мне тоже нужно было то же самое, и в итоге я написал этот метод расширения, который работает для меня:

public static class MoqExtensions {
    public static void Returns<TMock,TResult>(this ISetup<TMock, TResult> source, params TResult[] results) where TMock : class {
        int currentResultIndex = 0;

        source.Returns (() => {
            if(currentResultIndex >= results.Length) {
                currentResultIndex = 0;
            }

            return results [currentResultIndex++];
        });
    }
}

И пример использования:

someMock.Setup(o => o.AMethodWithReturnTypeInt()).Returns(1, 2, 3, 4);

Для этого примера, если вы вызовете метод-заглушку, скажем, 6 раз, он вернет 1, 2, 3, 4, 1, 2 соответственно.

Надеюсь, это поможет ...

1 голос
/ 22 сентября 2009

Moq не поддерживает упорядочение ожиданий. Подробнее см. здесь .

Хотя в настоящее время я использую Moq, раньше я использовал RhinoMocks, и у него, безусловно, есть некоторые функции, которые я иногда упускаю из-за ожиданий Moq, являющихся одним из них.

...