Enlaces e información

Comenta lo que creas oportuno.


Otros posts
Sobre el carnet por puntos
Testeando el Interfaz.

Mockeando el Interfaz

Escrito por Roberto M. Oliva en Junio 5th, 2006

En el anterior post, explicaba como testear el interfaz despues de haberlo separado en los datos y en el controlador. Para ello codificábamos una clase (CCalculadoraTestView) que implementaba el interfaz de datos (ICalculadoraView) y que servía para pasar los datos al objeto controlador (CCalculadoraController) que es el que de verdad queremos testear.
Existe un método que nos permite testear este controlador sin tener que codificar esa clase de prueba intermedia. Podemos hacer testeos sin tener que incluir ningun código adicional. Este metodo se basa en utilizar objetos Mock. Para ello, utilizo una librería gratuíta denominada RhinoMocks. Dentro de las librerías de mocks que he tenido la posibilidad de probar, esta es la que más me gusta.
La idea es crear un objeto en tiempo de ejecución que implemente un interfaz y que “engañe” al objeto que vamos a probar. El objeto que vamos a crear en tiempo de ejecución emplea el Interfaz ICalculadoraTestView. Esto se hace con el siguiente código:

m_objMocks = new Rhino.Mocks.MockRepository();
m_objCalculadoraView = m_objMocks.CreateMock<ICalculadoraView>();

Y se le puede pasar al controlador haciendole creer que es la vista de toda la vida:

m_objCalculadoraController = new CCalculadoraController(m_objCalculadoraView);

A partir de aquí los testeos se basan en decirle al objeto Mock como tiene que responder ante las distintas operaciones a las que le va a someter el controlador, digamos que es una manera de preparar al Mock para que el controlador piense que esta trabajando con un objeto de vista real. Por ejemplo, para testear la suma:

Rhino.Mocks.Expect.Call(m_objCalculadoraView.Operador1).Return(c_dblOp1);
Rhino.Mocks.Expect.Call(m_objCalculadoraView.Operador2).Return(c_dblOp2);
Rhino.Mocks.Expect.Call(m_objCalculadoraView.Operacion).Return(eOperacion.eSuma);
m_objMocks.ReplayAll();

Assert.AreEqual(m_objCalculadoraController.Calcular(), c_dblOp1 + c_dblOp2);

Como se puede ver, el controlador, al sumar va a preguntar a la vista los dos operadores y la operacion a realizar. Con lo cual vamos a testear totalmente si el controlador realiza la operación correctamente.
He cambiado un poco la implementación de los dos interfaces para facilitar la compresión del código ,pero la esencia del código de ejemplo es la misma.



Escriba un comentario

Dediquele un momento a comentar lo que piensa. Esta permitido usar HTML básico para formatear el escrito.

Comentarios de los lectores

Sea el primero en dejar un comentario.