PRUEBAS
Simular solicitudes de purple es aún más fácil
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.json
que son los siguientes:
npm run construct
: El comando de embalaje derollup
.npm run check:demo1
: Simplementemock
la biblioteca de solicitud de purple encapsulada.npm run check:demo2
: Completar lamock
por volver a implementarhook
.npm run check:demo3
: Usar la biblioteca enJest
para completar la implementación dedemo2
.npm run check:demo4-5
: Empezar unnode
servidor,proxy
la solicitud de purple a través del proxy deaxios
y reenviarlo al inicionode
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 esjest-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 JSDOM
el archivo de inicio check/config/setup.js
se configura en el setupFiles
atributo configurado en jest.config.js
y JSDOM
se inicializa aquí.
Easy mock
el procesamiento se realiza en check/demo1.check.js
y 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 Capabilities
consulte 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 Capabilities
en Jest
.
demo3
se puede intentar ejecutar npm run check:demo3
. El ejemplo en demo2
es realmente complicado de escribir. En Jest
, Mock Capabilities
cuenta 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
, globalSetup
y globalTeardown
elementos de configuración del jest.config.js
archivo de configuración.
Primero vamos a empezar con setupFiles
. Además de inicializar JSDOM
tambié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 elcontex
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.