2012-02-07 10 views
5

Tengo el siguiente código donde mi interfaz Mock tiene una propiedad Recorder que es una clase.Configuración de la propiedad de simulación a través de la instalación causa 'La expresión no es una invocación al método'

Intento establecer una propiedad en esa clase pero obtengo un error de Expression is not a method invocation. ¿Podrías ayudar?

El error está en el tiempo de ejecución cuando se trata de probar un conjunto de la propiedad enum. Se lanza una excepción ArgumentException con el seguimiento de la pila a continuación:

at Moq.ExpressionExtensions.ToMethodCall(LambdaExpression expression) 
    at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b() 
    at Moq.PexProtector.Invoke[T](Func`1 function) 
    at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition) 
    at Moq.Mock`1.Setup[TResult](Expression`1 expression) 

Gracias

//Works 
var mock = new Moq.Mock<IEngine>(); 
//Works 
mock.Setup(x => x.Recorder).Returns(new Moq.Mock<Recorder>().Object); 
//Fails on the next line assigning a property value!!! 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 

ACTUALIZACIÓN - he encontrado que RunState no es una propiedad sino un campo/miembro que es una enumeración

+0

¿Podría decirnos * dónde * obtiene el error? ¿Es un error de tiempo de compilación o de tiempo de ejecución, y si es un error de tiempo de ejecución, cuándo ocurre? –

+0

@JonSkeet hecho! – Jon

+0

Entonces, ¿qué llamada está fallando, la primera o la segunda? (Si es el primero, eliminemos por completo el segundo de la imagen ...) –

Respuesta

6

he encontrado que la creación de una maqueta de la grabadora y luego asignar valores al objeto de burla parece solucionar el problema. Sin embargo, no estoy seguro de si esa es la forma correcta de hacer las cosas.

var mockRecorder = new Moq.Mock<Recorder>(); 
mockRecorder.Object.RunState = Recorder.eRunStates.Play; 
4

Creo que deberías devolver el simulacro que has creado en la primera parte para la segunda parte:

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.Setup(x => x.RunState).Returns(Recorder.eRunStates.Play); 

Eso es solo una suposición, sin haber usado Moq, pero tiene sentido.

Sin embargo, esto parece que terminará siendo bastante frágil. Es posible que desee considerar el uso de un falso en su lugar aquí - por lo menos uno de los objetos, si no ambos.

EDIT: Mirando el documentation, una alternativa sería:

// Moq will set up the hierarchy for you... 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 
+0

Desafortunadamente, esto causa el mismo error. ¿Por falso te refieres a uno escrito a mano? – Jon

+0

@Jon: sí. Se siente bastante frágil para confiar en las propiedades específicas que se llaman. –

+0

Este es un código legacy desagradable y estoy a punto de renunciar a ser honesto – Jon

1

que tiene que hacer la configuración en su objeto de burla para configurar la propiedad RunState lugar.

var mockRecorder = new Mock<Recorder>(); 
mockRecorder.Setup(x => x.RunState).Returns(eRunStates.Play); 

mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 

EDIT: Para su información, que tiene que hacer toda la instalación en el simulacro antes de acceder a la propiedad .Object como se crea el objeto en este punto y otras configuraciones no puede suceder.

Además, un par de sugerencias, parece que su enumeración para los estados de ejecución está anidada en su clase de grabadora, la movería a una clase separada &, además, suelte el prefijo 'e'.

2

Si utiliza SetupGet en los simulacros en lugar de la configuración que esto funcionará

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.SetupGet(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.SetupGet(x => x.RunState).Returns(Recorder.eRunStates.Play); 
+0

Mismo problema. Has notado que es un campo no una propiedad – Jon

+0

¿Necesitas una simulación entonces? – Ciaran

+0

Sí, porque necesito afirmar que se llama a un método en IEngine, pero esto debe ser burlado y pasarlo a otra clase – Jon

Cuestiones relacionadas