2010-06-28 12 views
48

Estoy en el punto donde tengo que escribir pruebas de unidad para una API REST escrita con CakePHP 1.3. La API admite solicitudes GET, POST y PUT para consultar y manipular datos.¿Cómo probar la unidad de su API?

¿Hay alguna forma establecida de probar la entrada/salida correcta de una API que simule una solicitud HTTP, usando accesorios? No quiero ejecutar solicitudes POST/PUT reales contra la base de datos en vivo (dev). ¿Cómo puedo burlarme mejor del sistema para usar modelos temporales, y probar el resto de la pila tal como está?


Probar las solicitudes GET es bastante fácil con controller tests. Sin embargo, para la manipulación de datos, la API usa encabezados HTTP bastante extensamente y también analiza datos XML sin procesar y JSON POST/PUT. Los métodos de prueba de la unidad controladora solo se burlan de los datos POST configurando $this->data en el controlador, lo que no me permite probar la API correctamente.

+3

Si está probando casi toda la pila a la vez, ya no es realmente una prueba unitaria, ¿verdad? – wds

+0

@wds Entonces, nuevamente, ¿no es una solicitud API como una llamada de función para el cliente? ¿Por qué * no debería * probar esto como un todo? – deceze

+2

es solo una cuestión menor de nomenclatura. Habría llamado a esto una prueba de integración, no una prueba de unidad. – wds

Respuesta

3

Parece que usted podría ser capaz de probar el PUT XML sin procesar y datos POST sin demasiados problemas. The CakePHP REST documentation dice esto:

Si una petición POST o PUT tiene un tipo de contenido XML, entonces la entrada se toma y se pasa a una instancia de objeto XML de la torta, que se asigna a la propiedad $ datos del controlador. Debido a esta característica, el manejo de datos XML y POST en paralelo es perfecto: no se requieren cambios en el controlador o el código del modelo. Todo lo que necesita debe terminar en $ this-> data.

Intente recorrer el código de su controlador en modo de depuración para ver lo que realmente entra por $this->data durante una solicitud XML.

cuanto a evitar la base de datos en vivo, habría una SQLite base de datos en memoria ser más fácil?

+0

Realmente no me importa qué tipo de base de datos estoy usando, quiero usar accesorios en las tablas de prueba. Estos solo están disponibles a través de objetos parcialmente burlados, lo que me obliga a omitir algunas partes de bajo nivel en la API. Para probar la API completa como lo vería un cliente, necesito acceder a los datos sin procesar POST/PUT, porque estoy a) haciendo una verificación de firma en los datos publicados yb) también necesito probar los datos JSON publicados. Fingir el proceso con objetos simulados y establecer '$ this-> data' funciona en cierta medida, pero no me permite probar todo el ciclo de solicitud/respuesta API como una sola unidad. – deceze

+0

Usé accesorios de prueba en algunas pruebas, @deceze, y no recuerdo haber tenido que burlarse de nada. La burla fue necesaria para probar los métodos del controlador, creo. Han pasado unos meses, así que puede haber olvidado algunos detalles. Seguí las instrucciones aquí: http://book.cakephp.org/view/363/Testing-models –

+0

Si está intentando probar la parte del ciclo entre la solicitud http y el método del controlador, @deceze, entonces abordaría eso por separado como una prueba de integración. Simplemente pruébelo una vez porque todo se maneja con el código de enrutamiento de CakePHP. Luego, para cada uno de los métodos de su controlador, puede escribir una prueba de unidad más simple sin preocuparse por el enrutamiento. –

3

Debe o bien crear o utilizar Mocks Marco de aislamiento con el fin de simular el entorno de la API. Las pruebas unitarias no deben depender de los recursos como las conexiones a Internet, red, etc. puntos finales

Si tiene la intención de probar la API real de llamadas que debe crear proyecto de prueba de integración y utilizarlo para este propósito. Pero tenga en cuenta que las pruebas de integración en su mayoría no son repetibles y le brindarán resultados diferentes en cada ejecución.

Cuestiones relacionadas