Можно ли назначить out
/ref
параметр с помощью Moq (3.0+)?
Я смотрел на использование Callback()
, но Action<>
не поддерживает параметры ref, потому что он основан на обобщениях. Я также предпочел бы поставить ограничение ( It.Is
) на входе ref
параметра, хотя я могу сделать это в обратном вызове.
Я знаю, что Rhino Mocks поддерживает эту функцию, но проект, над которым я работаю, уже использует Moq.
It.IsAny<T>()
matcher (ref It.Ref<T>.IsAny
) и заканчивая поддержкой для настройки.Callback()
и с.Returns()
помощью пользовательских типов делегатов, соответствующих сигнатуре метода. Защищенные методы одинаково поддерживаются. Смотрите, например, мой ответ ниже .Ответы:
В Moq версии 4.8 (или выше) значительно улучшена поддержка параметров by-ref:
Тот же шаблон работает для
out
параметров.It.Ref<T>.IsAny
также работает для параметров C # 7in
(так как они также by-ref).источник
out
правда?Для «вне», мне кажется, что следующее работает
Я предполагаю, что Moq смотрит на значение «Ожидаемое значение» при вызове программы установки и запоминает его.
Для
ref
, я искал ответ тоже.Мне показалось полезным следующее руководство по быстрому запуску: https://github.com/Moq/moq4/wiki/Quickstart
источник
Setup
РЕДАКТИРОВАТЬ : В Moq 4.10, теперь вы можете передать делегат с параметром out или ref непосредственно в функцию обратного вызова:
Вам нужно будет определить делегата и создать его экземпляр:
Для версии Moq до 4.10:
Авнер Каштан предоставляет метод расширения в своем блоге, который позволяет устанавливать параметр out из обратного вызова: параметры Moq, Callbacks и Out: особенно сложный крайний случай
Решение элегантное и хакерское. Элегантный в том, что он обеспечивает свободный синтаксис, который чувствует себя как дома с другими обратными вызовами Moq. И хакерский, потому что он основан на вызове некоторых внутренних API Moq через рефлексию.
Метод расширения, предоставленный по вышеуказанной ссылке, не скомпилирован для меня, поэтому я предоставил отредактированную версию ниже. Вам нужно будет создать подпись для каждого количества входных параметров, которые у вас есть; Я предоставил 0 и 1, но его дальнейшее расширение должно быть простым:
С помощью вышеуказанного метода расширения вы можете протестировать интерфейс без параметров, таких как:
.. со следующей настройкой Moq:
Изменить : Для поддержки методов void-return вам просто нужно добавить новые методы перегрузки:
Это позволяет тестировать интерфейсы, такие как:
источник
var methodCall = mock.GetType().GetProperty("Setup").GetValue(mock); mock.GetType().Assembly.GetType("Moq.MethodCall") .InvokeMember("SetCallbackResponse", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, methodCall, new[] { action });
mock.Setup(x=>x.Method(out d)).Callback(myDelegate).Returns(...);
вам нужно будет определить делегат и создать его экземпляр:...Callback(new MyDelegate((out decimal v)=>v=12m))...;
Это документация с сайта Moq :
источник
Похоже, это невозможно из коробки. Похоже, кто-то пытался найти решение
Смотрите это сообщение на форуме http://code.google.com/p/moq/issues/detail?id=176.
этот вопрос Проверьте значение ссылочного параметра с помощью Moq
источник
Чтобы вернуть значение вместе с настройкой параметра ref, вот фрагмент кода:
Затем объявите свой собственный делегат, соответствующий сигнатуре метода, который нужно смоделировать, и предоставьте собственную реализацию метода.
источник
Опираясь на Billy Jakes awnser, я создал полностью динамический метод имитации с параметром out. Я публикую это здесь для тех, кто сочтет это полезным (вероятно, просто будущие меня).
источник
Я уверен, что решение Скотта сработало в один момент,
Но это хороший аргумент для того, чтобы не использовать рефлексию, чтобы заглянуть в частный apis. Это сломано сейчас.
Я был в состоянии установить параметры с помощью делегата
источник
Это может быть решением.
источник
Я боролся со многими предложениями здесь, прежде чем просто создал экземпляр нового класса 'Fake', который реализует любой интерфейс, который вы пытаетесь макетировать. Затем вы можете просто установить значение параметра out с помощью самого метода.
источник
Я боролся с этим в течение часа сегодня днем и не мог найти ответ нигде. После самостоятельной игры я смог найти решение, которое сработало для меня.
Ключ здесь,
mock.SetupAllProperties();
который заглушит все свойства для вас. Это может не сработать в каждом конкретном случае сценарии теста, но если все , что вы заботитесь о полученииreturn value
из ,YourMethod
то это будет прекрасно работать.источник