2011-01-05 17 views
7

Tengo esta interfaz que devuelve vacío en algunas funciones que me gustaría burlar y me pregunto cuál es la forma correcta de hacerlo. A partir de ahora tengo lo siguiente:¿Cuál es la forma correcta de simular las funciones vacías en RhinoMocks?

var mocks = new MockRepository(); 
var mockedInterface = mocks.CreateMock<IMyInterface>(); 
Expect.Call(mockedInterface.FunctionThatReturn(param1, param2)).Return(Something); 
mockedInterface.FunctionReturningVoid(param3, param4); 
mocks.ReplayAll(); 

// Some assert and other stuff 
mocks.VerifyAll(); 

¿Es esa la forma correcta de hacerlo? Creo que se ve raro ya que no estás manejando las dos funciones de la misma manera. Lo que me gustaría escribir es:

var mocks = new MockRepository(); 
var mockedInterface = mocks.CreateMock<IMyInterface>(); 
Expect.Call(mockedInterface.FunctionThatReturn(param1, param2)).Return(Something); 
Expect.Call(mockedInterface.FunctionReturningVoid(param3, param4)); // This doesn't work. 
mocks.ReplayAll(); 

// Some assert and other stuff 
mocks.VerifyAll(); 

Pero eso no funciona en la fila 4. He encontrado algunos blog que dice que usted puede utilizar lambdas (o delegado) como

Expect.Call(() => mockedInterface.FunctionReturningVoid(param3, param4)); // This doesn't work. 

Pero eso no Parece que tampoco funciona para mí. Tener el Expect.Call hace que sea fácil identificar funciones falsas y es por eso que lo quiero. El error de compilación que obtengo es: "No se puede convertir la expresión lambda para escribir 'objeto' porque no es un tipo de delegado".

Entonces, ¿cómo se debe hacer?

ACTUALIZACIÓN: Se agregó información de error de compilación.

+2

Se puede publicar IMyInterface también? –

Respuesta

1

Para los métodos de vacío que utilizan delegados anónimos:

Expect.Call(delegate { mockedInterface.FunctionReturningVoid(param3, param4); }) 

cierto: me gusta la sintaxis de registro-reproducción para reproducir y verificar las expectativas http://www.ayende.com/Wiki/(S(j2mgwqzgkqghrs55wp2cwi45))/Comparison+of+different+Rhino+Mocks+syntaxes.ashx

+0

Pero eso ni siquiera compilará para mí ... y no sé por qué. –

+0

¿Qué error recibes? –

+0

Totalmente echado de menos que tanto usted como Patrick Steele escribieron un comentario más. Actualicé la publicación con error de compilación. –

6

prefiero la AAA (arreglos/act/aserción) Sintaxis en lugar de grabar/reproducir Es más sencillo y hace que las pruebas sean más fáciles de leer. Lo que querrá hacer es:

// arrange 
var mock = MockRepository.GenerateMock<IMyInterface> 
mock.Expect(i => i.FunctionThatReturnSomething(param1, param2)).Return("hello"); 
mock.Expect(i => i.FunctionThatReturnVoid(param3, param4)); 
// set up other stuff for your code (like whatever code depends on IMyInterface) 
var foo = new Foo(mock); 

// act 
foo.DoSomething(); 

// assert 
mock.VerifyAll(); 
+1

La pregunta no es sobre cómo debe escribir su prueba de unidad, la pregunta era cómo debería simular funciones vacías. Pero a excepción de eso, ¿no necesita el 'ReplayAll' antes de poder usar' VerifyAll'? –

+0

Totalmente echado de menos que tanto tú como Lazyberezovsky escribieron un comentario más. Actualicé la publicación con error de compilación. –

+1

@Tomas: la tercera línea de código proporcionada por Patrick muestra cómo simular los métodos de vacío. En cuanto a llamar a "ReplayAll", eso no es necesario cuando se usa la sintaxis AAA.Tenga en cuenta que VerifyAll está llamando está en el objeto burlado particular, no en una instancia de MockRepository. – Pedro

0

No estoy seguro de cómo probar el método vacío en el patrón AAA, también tuve problemas para burlar el vacío. Sin embargo, en el pasado, uso el estilo Grabar y Reproducir, y eso debería funcionar.

Ejemplo:

private MockRepository m_mocks = new MockRepository(); 
private IXGateManager xGateManager = m_mocks.DynamicMock<IXGateManager>(); 

using (m_mocks.Record()) 
{ 
    xGateManager.SendXGateMessage(null, null); 
    LastCall.IgnoreArguments().Repeat.Once(); 
} 

using (m_mocks.Playback()) 
{ 
    //... execute your test 
} 
Cuestiones relacionadas