2009-05-28 28 views
8

¿Qué es ObjectMother y cuáles son los escenarios de uso común para este patrón?¿Qué es una ObjectMother?

+0

Le hubiese votado esta vez si pudiera (le doy crédito por adaptar mis comentarios), pero dice que mi voto se bloqueó. ¡Si arreglas tu sitio web, lo haré! – area5one

Respuesta

17

ObjectMother comienza con el patrón de fábrica, entregando objetos prefabricados listos para prueba a través de una simple llamada a un método. Se mueve más allá del ámbito de la fábrica por facilitando la personalización de objetos creados, proporcionando métodos para actualizar los objetos durante las pruebas, y si es necesario, eliminando el objeto de la base de datos al finalizar la prueba.

Algunas razones para utilizar ObjectMother:
* Reducir la duplicación de código en las pruebas, el aumento de capacidad de mantenimiento de prueba
* Hacer prueba de objetos súper fácil acceso, alentando a los desarrolladores escribir más pruebas.
* Todas las pruebas se ejecutan con datos nuevos.
* Las pruebas siempre se limpian después de ellas.

(http://c2.com/cgi/wiki?ObjectMother)

+2

Me pregunto, ¿hay un nombre alternativo para "Object Mother"? Tal vez 'TestDataProvider', o algo así? – vikingsteve

1

Como se indica en otra parte, ObjectMother es una fábrica para generar objetos normalmente (¿exclusivamente?) para usar en pruebas unitarias.

Donde son de gran utilidad es para generar objetos complejos donde los datos no son de particular importancia para la prueba.

donde es posible que haya creado una instancia vacía bajo como

Order rubishOrder = new Order("NoPropertiesSet"); 
    _orderProcessor.Process(rubishOrder); 

que usaría una sensata desde el ObjectMother

Order motherOrder = ObjectMother.SimpleOrder(); 
    _orderProcessor.Process(motherOrder); 

Esto tiende a ayudar con situaciones en las que la clase está probando aperturas confiar en que se pase un objeto sensible.

Por ejemplo, si agregó alguna validación de OrderNumber a la clase de orden anterior, simplemente necesitaría para crear una instancia del OrderNumber en la clase SimpleObject para que pasen todas las pruebas existentes, dejándote concentrado en escribir las pruebas de validación.

Si acaba de crear una instancia del objeto en la prueba, deberá agregarlo a cada prueba (es impactante la frecuencia con la que he visto a gente hacer esto).

Por supuesto, esto solo podría extraerse a un método, pero ponerlo en una clase separada permite que se comparta entre varias clases de prueba.

Otro comportamiento recomendado es utilizar buenos nombres descriptivos para sus métodos, para promover la reutilización. Es muy fácil terminar con un objeto por prueba, que definitivamente debe evitarse. Es mejor generar objetos que representen atributos generales que específicos y personalizarlos para su prueba. Por ejemplo, ObjectMother.WealthyCustomer() en lugar de ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorsche() y ObjectMother.CustomerWith1MdollarsSharesInBigPharmaAndDrivesAPorscheAndAFerrari()