¿Es posible asignar un parámetro out
/ ref
usando Moq (3.0+)?
He analizado el uso Callback()
, pero Action<>
no admite parámetros de referencia porque está basado en genéricos. También me gustaría preferiblemente poner una restricción ( It.Is
) en la entrada del ref
parámetro, aunque puedo hacerlo en la devolución de llamada.
Sé que Rhino Mocks admite esta funcionalidad, pero el proyecto en el que estoy trabajando ya está usando Moq.
It.IsAny<T>()
comparador similar (ref It.Ref<T>.IsAny
) hasta compatibilidad para la configuración.Callback()
y a.Returns()
través de un tipo de delegado personalizado que coincide con la firma del método. Los métodos protegidos son igualmente compatibles. Ver, por ejemplo, mi respuesta a continuación .Respuestas:
La versión 4.8 de Moq (o posterior) tiene un soporte mucho mejor para los parámetros by-ref:
El mismo patrón funciona para los
out
parámetros.It.Ref<T>.IsAny
También funciona para losin
parámetros de C # 7 (ya que también son by-ref).fuente
out
embargo, esta misma solución no funciona , ¿verdad?Para 'fuera', lo siguiente parece funcionar para mí.
Supongo que Moq analiza el valor de 'esperadaValor' cuando llama a Configuración y lo recuerda.
Para
ref
, estoy buscando una respuesta también.La siguiente guía de inicio rápido me pareció útil: https://github.com/Moq/moq4/wiki/Quickstart
fuente
Setup
EDITAR : en Moq 4.10, ahora puede pasar un delegado que tiene un parámetro de salida o referencia directamente a la función de devolución de llamada:
Tendrá que definir un delegado e instanciarlo:
Para la versión Moq anterior a 4.10:
Avner Kashtan proporciona un método de extensión en su blog que permite configurar el parámetro de salida de una devolución de llamada: parámetros Moq, Callbacks y Out: un caso extremo particularmente complicado
La solución es elegante y hacky. Elegante porque proporciona una sintaxis fluida que se siente como en casa con otras devoluciones de llamada de Moq. Y hacky porque se basa en llamar a algunas API internas de Moq a través de la reflexión.
El método de extensión proporcionado en el enlace anterior no se compiló para mí, por lo que he proporcionado una versión editada a continuación. Deberá crear una firma para cada número de parámetros de entrada que tenga; He proporcionado 0 y 1, pero extenderlo aún más debería ser simple:
Con el método de extensión anterior, puede probar una interfaz sin parámetros como:
.. con la siguiente configuración de Moq:
Editar : para admitir los métodos de retorno de vacío, simplemente necesita agregar nuevos métodos de sobrecarga:
Esto permite probar interfaces como:
fuente
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(...);
tendrá que definir un delegado e instanciarlo:...Callback(new MyDelegate((out decimal v)=>v=12m))...;
Esta es la documentación del sitio de Moq :
fuente
Parece que no es posible fuera de la caja. Parece que alguien intentó una solución
Ver esta publicación del foro http://code.google.com/p/moq/issues/detail?id=176
esta pregunta Verifique el valor del parámetro de referencia con Moq
fuente
Para devolver un valor junto con la configuración del parámetro ref, aquí hay un fragmento de código:
A continuación, declare su propio delegado que coincida con la firma del método a burlar y proporcione su propia implementación del método.
fuente
Sobre la base de Billy Jakes Awnser, hice un método simulado completamente dinámico con un parámetro out. Estoy publicando esto aquí para cualquiera que lo encuentre útil (probablemente solo futuro).
fuente
Estoy seguro de que la solución de Scott funcionó en un punto,
Pero es un buen argumento para no usar la reflexión para mirar las API privadas. Está roto ahora.
Pude establecer parámetros usando un delegado
fuente
Esto puede ser una solución.
fuente
Luché con muchas de las sugerencias aquí antes de crear una instancia de una nueva clase 'Fake' que implemente cualquier interfaz que esté tratando de burlarse. Luego, simplemente puede establecer el valor del parámetro out con el método mismo.
fuente
Luché con esto durante una hora esta tarde y no pude encontrar una respuesta en ninguna parte. Después de jugar por mi cuenta, pude encontrar una solución que funcionó para mí.
La clave aquí es
mock.SetupAllProperties();
que eliminará todas las propiedades por usted. Esto puede no funcionar en todos los casos de prueba, pero si todo lo que importa es conseguir que elreturn value
deYourMethod
entonces este trabajo fino voluntad.fuente