Cómo simular una solicitud de purple en Jest | de Sabesan Sathananthan | cultura friki


PRUEBAS

Simular solicitudes de purple es aún más fácil

Foto por taylor vick en Unsplash

Hoy en día, es necesario modificar una biblioteca más antigua para TS y realizar pruebas unitarias. Si la biblioteca se modifica para TS, todavía hay un poco mejor. Las pruebas unitarias son puramente un estudio precise y se venden ahora. Para que los principiantes aprendan el Jest marco, creo que lo más problemático en las pruebas unitarias es probar las solicitudes de purple. Así que registre algunas de las formas en que Mock cayó Axios para iniciar solicitudes de purple. Este es mi artículo número 39 de Medium.

Los ejemplos mencionados en el artículo están todos en el jest-simulacro-servidor repositorio. Puede iniciar el ejemplo directamente instalando el administrador de paquetes, por ejemplo, instalando a través de yarn:

$ yarn set up

Algunos comandos se especifican en el package deal.jsonque son los siguientes:

  • npm run construct : El comando de embalaje de rollup .
  • npm run check:demo1 : Simplemente mock la biblioteca de solicitud de purple encapsulada.
  • npm run check:demo2 : Completar la mock por volver a implementar hook.
  • npm run check:demo3 : Usar la biblioteca en Jest para completar la implementación de demo2.
  • npm run check:demo4-5 : Empezar un node servidor, proxy la solicitud de purple a través del proxy de axiosy reenviarlo al inicio node servidor. Al establecer la solicitud de prueba unitaria correspondiente y los datos de respuesta, la relación correspondiente se utiliza para realizar la prueba, que es jest-mock-server trabajo terminado.

Aquí encapsulamos una capa de axios, que está más cerca de la escena actual. Puedes ver el check/demo/wrap-request.ts expediente. De hecho, simplemente crea un axios instancia internamente y reenvía los datos de respuesta.

Él check/demo/index.ts archivo simplemente exporta un counter método, donde estos dos parámetros se procesan hasta cierto punto antes de que se inicie la solicitud de purple. Luego, los datos de respuesta también se procesan hasta cierto punto, solo para simular operaciones relacionadas.

Aquí Jest utiliza el entorno del navegador simulado por JSDOMel archivo de inicio check/config/setup.js se configura en el setupFiles atributo configurado en jest.config.jsy JSDOM se inicializa aquí.

Easy mock el procesamiento se realiza en check/demo1.check.jsy puede intentar ejecutarlo a través de npm run check:demo1. De hecho, un mock la operación se realiza en el wrap-request biblioteca que envuelve axios. wrap-request será compilado cuando Jest Está empezado. Después de simular la biblioteca aquí, todos los archivos importados a la biblioteca obtendrán los objetos simulados. En otras palabras, podemos pensar que esta biblioteca ha sido reescrita, y los métodos después de la reescritura son todos JEST‘s Mock Capabilities . Puede utilizar funciones como mockReturnValue para la simulación de datos. Para Mock Capabilitiesconsulte este Enlace.

Aquí hemos completado el Mock del valor devuelto, lo que significa que podemos controlar el valor devuelto por el request en el wrap-request biblioteca. Sin embargo, se mencionó antes que también hay ciertos procesos para los parámetros entrantes. No hemos hecho ninguna afirmación sobre esta parte del contenido, por lo que también debemos tratar de lidiar con esto.

demo2 se puede intentar ejecutar npm run check:demo2. Como se mencionó anteriormente, podemos manejar el valor devuelto, pero no hay forma de afirmar si los parámetros de entrada se procesan correctamente, por lo que debemos lidiar con esta situación. Afortunadamente, Jest proporciona una forma de implementar directamente la biblioteca de funciones que se burla. Por lo tanto, Jest también proporciona un mockImplementation método que se utiliza en demo3. Aquí hemos reescrito la biblioteca de funciones simuladas. También podemos usar jest.fn completar Implementations . Aquí escribimos un hook función antes de regresar y luego implementar aserciones o especificar valores de retorno en cada check. De esta manera, se puede resolver el problema anterior, que en realidad es la realización de mockImplementation de Mock Capabilitiesen Jest.

demo3 se puede intentar ejecutar npm run check:demo3. El ejemplo en demo2 es realmente complicado de escribir. En Jest, Mock Capabilitiescuenta con la implementación de mockImplementation que se puede utilizar directamente.

demo4 y demo5 se puede intentar ejecutar npm run check:demo4–5. De esta manera, se realiza una solicitud de datos reales. Aquí, axios El proxy se utilizará para reenviar solicitudes de datos internos al puerto del servidor especificado. Por lo tanto, el servidor también se inicia localmente y la prueba se realiza especificando los datos de solicitud y respuesta relacionados con el correspondiente path. Si los datos solicitados son incorrectos, los datos de respuesta relacionados no coincidirán normalmente. Por lo tanto, la solicitud devolverá directamente 500. Si los datos de respuesta devueltos son incorrectos, también se capturarán durante la aserción. En el jest-mock-server biblioteca, primero, necesitamos especificar tres archivos que correspondan a los tres ciclos de vida que cada archivo de prueba de unidad se ejecutará antes del inicio. Jest la prueba se ejecuta antes de los tres ciclos de vida y los tres ciclos de vida se ejecutan después de la Jest se completa la prueba. Los tres archivos que necesitamos especificar son los setupFiles, globalSetupy globalTeardown elementos de configuración del jest.config.js archivo de configuración.

Primero vamos a empezar con setupFiles. Además de inicializar JSDOMtambién necesitamos operar el proxy predeterminado de axios. Porque la solución adoptada es utilizar el proxy de axios para reenviar solicitudes de datos. Por lo tanto, es necesario establecer el valor del proxy al frente de la prueba unitaria.

Una vez que configuramos el archivo anterior dentro delcheck/config carpeta, entonces necesitamos agregar dos archivos más allí que son globalSetup y globalTeardown . Estos dos archivos se refieren a las operaciones realizadas antes de la Jest comienza la prueba unitaria y después de que se completan todas las pruebas. Ponemos las operaciones de inicio y apagado del servidor en esos dos archivos.

Tenga en cuenta que el archivo que se ejecuta en estos dos archivos es un archivo independiente separado contex que no tiene nada que ver con el contex de cualquier prueba unitaria, incluido el archivo especificado por el elemento de configuración setupFiles. Por lo tanto, todos los datos aquí se especifican en el archivo de configuración o se transmiten entre los puertos del servidor a través de la purple.

Para el puerto de configuración y la información del nombre de dominio, colóquelo directamente en el globals campo en jest.config.js. Para el debug elemento de configuración, se recomienda usarlo junto con check.solely.

Ahora, puede haber una sugerencia de por qué el servidor no debe iniciarse y apagarse en el beforeAll y afterAll ciclos de vida de cada archivo de prueba de unidad. Por lo tanto, he probado esta solución. En esta solución, para cada archivo de prueba, el servidor se inicia y luego se apaga. Por lo tanto, esta solución requiere relativamente mucho tiempo. Pero en teoría, esta solución es razonable. Después de todo, es cierto que el aislamiento de datos es necesario. Pero hay un problema cuando afterAll está cerrado. En realidad, no cierra la ocupación del servidor y del puerto porque el shut Se llama al método cuando el node el servidor está cerrado. CuándoafterAll está cerrado, simplemente dejó de procesar la solicitud pero el puerto aún está ocupado. Cuando se inicia el segundo archivo de prueba de unidad, se generará una excepción de que se está utilizando el puerto. Aunque probé algunas soluciones, no son ideales porque a veces el puerto todavía está ocupado. Especialmente cuando el node se ejecuta por primera vez después de que se enciende, la probabilidad de anormalidad es relativamente alta. Por lo tanto, el efecto no es muy satisfactorio. Al closing, se adopta el esquema de aislamiento completo. Para problemas relacionados específicos, consulte este Enlace.

Dado que adoptamos una solución completamente aislada, solo hay dos opciones cuando queremos transmitir los datos de solicitud y respuesta para la solicitud de prueba. Las dos soluciones son cuando se inicia el servidor, todos los datos se especifican en el check/config/global-setup.js El archivo o los datos se transmiten a través de la purple cuando el servidor se está ejecutando, se especifica la ruta y la solicitud de purple de la ruta transportará datos y la solicitud de datos se especificará en el cierre del servidor. Por lo tanto, ambas opciones son compatibles aquí. Creo que es más apropiado especificar sus propios datos en cada archivo de prueba de unidad, por lo que aquí hay solo un ejemplo de cómo especificar los datos que se probarán en el archivo de prueba de unidad. Con respecto a los datos a probar, un DataMapper El tipo se especifica para reducir las excepciones causadas por errores de tipo. Por lo tanto, aquí se ejemplifican dos conjuntos de datos. Además, se admiten expresiones regulares al hacer coincidir question y information. La estructura de la DataMapper tipo es relativamente estándar.

En las siguientes dos pruebas unitarias, los datos a probar se especifican en beforeAll. Tenga en cuenta que beforeAll es devuelve setSuitesData(datos) porque la prueba unitaria se ejecuta después de que se establecen los datos y la respuesta es exitosa, seguida de la solicitud regular y la respuesta si la prueba de aserción es correcta.

Related Articles

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram