Mockeando el Interfaz

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.

Todavía no hay comentarios

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Etiquetas HTML permitidas: <a> <blockquote> <br> <cite> <code> <dd> <div> <dl> <dt> <em> <h1> <h2> <h3> <h4> <h5> <h6> <hr> <img> <li> <ol> <p> <pre> <span> <strong> <swf> <table> <tbody> <td> <th> <tr> <ul>
    Allowed Style properties: background-color, background-image, border, border-bottom, border-bottom-color, border-bottom-style, border-bottom-width, border-color, border-left, border-left-color, border-left-style, border-left-width, border-right, border-right-color, border-right-style, border-right-width, border-spacing, border-style, border-top, border-top-color, border-top-style, border-top-width, border-width, color, direction, font, font-family, font-size, font-style, font-variant, font-weight, height, left, line-height, list-style-type, margin, margin-bottom, margin-left, margin-right, margin-top, padding, padding-bottom, padding-left, padding-right, padding-top, right, text-align, text-decoration, top, width
  • Syntax highlight code surrounded by the {syntaxhighlighter OPTIONS}...{/syntaxhighlighter} tags.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta es para comprobar si eres un ser humano y evitar el envío automático desde sistemas de spam