Plugins de Watch
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
El sistema de plugins de watch de Jest permite conectar con partes específicas de Jest y definir prompts en el menú de modo watch que ejecutan código al presionar teclas. Combinadas, estas características te permiten desarrollar experiencias interactivas personalizadas para tu flujo de trabajo.
Interfaz de Plugin de Watch
class MyWatchPlugin {
// Add hooks to Jest lifecycle events
apply(jestHooks) {}
// Get the prompt information for interactive plugins
getUsageInfo(globalConfig) {}
// Executed when the key from `getUsageInfo` is input
run(globalConfig, updateConfigAndRun) {}
}
Conexión con Jest
Para conectar tu plugin de watch a Jest, añade su ruta bajo watchPlugins en tu configuración de Jest:
module.exports = {
// ...
watchPlugins: ['path/to/yourWatchPlugin'],
};
Los plugins de watch personalizados pueden añadir hooks a eventos de Jest. Estos hooks pueden añadirse con o sin tener una tecla interactiva en el menú de modo watch.
apply(jestHooks)
Los hooks de Jest pueden adjuntarse implementando el método apply. Este método recibe un argumento jestHooks que permite al plugin conectarse a partes específicas del ciclo de vida de una ejecución de pruebas.
class MyWatchPlugin {
apply(jestHooks) {}
}
A continuación se muestran los hooks disponibles en Jest.
jestHooks.shouldRunTestSuite(testSuiteInfo)
Devuelve un booleano (o Promise<boolean> para operaciones asíncronas) que especifica si una prueba debe ejecutarse o no.
Por ejemplo:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.shouldRunTestSuite(testSuiteInfo => {
return testSuiteInfo.testPath.includes('my-keyword');
});
// or a promise
jestHooks.shouldRunTestSuite(testSuiteInfo => {
return Promise.resolve(testSuiteInfo.testPath.includes('my-keyword'));
});
}
}
jestHooks.onTestRunComplete(results)
Se llama al final de cada ejecución de pruebas. Recibe los resultados de las pruebas como argumento.
Por ejemplo:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.onTestRunComplete(results => {
this._hasSnapshotFailure = results.snapshot.failure;
});
}
}
jestHooks.onFileChange({projects})
Se llama cada vez que hay un cambio en el sistema de archivos
projects: Array<config: ProjectConfig, testPaths: Array<string>: Incluye todas las rutas de prueba que Jest está monitoreando.
Por ejemplo:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.onFileChange(({projects}) => {
this._projects = projects;
});
}
}
Integración con el Menú de Watch
Los plugins de watch personalizados también pueden añadir o sobrescribir funcionalidades en el menú de watch especificando un par clave/prompt en el método getUsageInfo y un método run para la ejecución de la tecla.
getUsageInfo(globalConfig)
Para añadir una tecla al menú de watch, implementa el método getUsageInfo devolviendo una tecla y el prompt:
class MyWatchPlugin {
getUsageInfo(globalConfig) {
return {
key: 's',
prompt: 'do something',
};
}
}
Esto añadirá una línea en el menú del modo watch (› Press s to do something.)
Watch Usage
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press q to quit watch mode.
› Press s to do something. // <-- This is our plugin
› Press Enter to trigger a test run.
Si la tecla para tu plugin ya existe como tecla predeterminada, tu plugin sobrescribirá esa tecla.
run(globalConfig, updateConfigAndRun)
Para manejar eventos de pulsación de teclas de la tecla devuelta por getUsageInfo, puedes implementar el método run. Este método devuelve un Promise<boolean> que se resuelve cuando el plugin quiere devolver el control a Jest. El boolean especifica si Jest debe volver a ejecutar las pruebas después de recuperar el control.
-
globalConfig: Representación de la configuración global actual de Jest -
updateConfigAndRun: Te permite iniciar una ejecución de pruebas mientras el plugin interactivo está en funcionamiento.
class MyWatchPlugin {
run(globalConfig, updateConfigAndRun) {
// do something.
}
}
Si llamas a updateConfigAndRun, tu método run no debe resolverse a un valor truthy, ya que esto desencadenaría una doble ejecución.
Claves de configuración autorizadas
Por razones de estabilidad y seguridad, solo se pueden actualizar parte de las claves de configuración global con updateConfigAndRun. La lista blanca actual es la siguiente:
Personalización
Los plugins se pueden personalizar mediante la configuración de Jest.
module.exports = {
// ...
watchPlugins: [
[
'path/to/yourWatchPlugin',
{
key: 'k', // <- your custom key
prompt: 'show a custom prompt',
},
],
],
};
Nombres de configuración recomendados:
-
key: Modifica la tecla del plugin. -
prompt: Permite personalizar el texto en el prompt del plugin.
Si el usuario proporciona una configuración personalizada, se pasará como argumento al constructor del plugin.
class MyWatchPlugin {
constructor({config}) {}
}
Cómo elegir una buena tecla
Jest permite que los plugins de terceros sobrescriban algunas teclas de funciones integradas, pero no todas. Específicamente, las siguientes teclas no se pueden sobrescribir:
-
c(borra patrones de filtro) -
i(actualiza snapshots no coincidentes interactivamente) -
q(sale) -
u(actualiza todos los snapshots no coincidentes) -
w(muestra el modo de uso/acciones disponibles)
Las siguientes teclas de funcionalidad integrada sí se pueden sobrescribir:
-
p(patrón de nombres de archivos de prueba) -
t(patrón de nombres de prueba)
Cualquier tecla no utilizada por funciones integradas se puede reclamar. Evita usar teclas difíciles de obtener en varios teclados (como é, €) o que no sean visibles por defecto (por ejemplo, muchos teclados Mac no muestran caracteres como |, \, [, etc.)
Cuando ocurre un conflicto
Si tu plugin intenta sobrescribir una tecla reservada, Jest mostrará un error con un mensaje descriptivo, como:
Watch plugin YourFaultyPlugin attempted to register key `q`, that is reserved internally for quitting watch mode. Please change the configuration key for this plugin.
También está prohibido que los plugins de terceros sobrescriban teclas reservadas por otros plugins presentes antes en la lista configurada (watchPlugins). Cuando esto ocurre, recibirás un mensaje de error que te ayudará a solucionarlo:
Watch plugins YourFaultyPlugin and TheirFaultyPlugin both attempted to register key `x`. Please change the key configuration for one of the conflicting plugins to avoid overlap.