Sigo recibiendo "localStorage no está definido" en las pruebas de Jest, lo que tiene sentido, pero ¿cuáles son mis opciones? Golpear paredes de ladrillo.
144
Gran solución de @chiedo
Sin embargo, usamos la sintaxis ES2015 y sentí que era un poco más limpio escribirlo de esta manera.
class LocalStorageMock {
constructor() {
this.store = {};
}
clear() {
this.store = {};
}
getItem(key) {
return this.store[key] || null;
}
setItem(key, value) {
this.store[key] = value.toString();
}
removeItem(key) {
delete this.store[key];
}
};
global.localStorage = new LocalStorageMock;
value + ''
en el setter para manejar correctamente los valores nulos e indefinidos|| null
, por eso mi prueba estaba fallando, porque en mi prueba estaba usandonot.toBeDefined()
. La solución @Chiedo lo hace funcionar de nuevoLo descubrí con ayuda de esto: https://groups.google.com/forum/#!topic/jestjs/9EPhuNWVYTg
Configure un archivo con los siguientes contenidos:
Luego agrega la siguiente línea a su package.json en sus configuraciones de Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
fuente
"setupFiles": [...]
funciona igual de bien Con la opción de matriz, permite separar simulacros en archivos separados. Por ejemplo:"setupFiles": ["<rootDir>/__mocks__/localStorageMock.js"]
getItem
difiere ligeramente de lo que devolvería un navegador si los datos no se configuran con una clave específica. llamargetItem("foo")
cuando no está configurado, por ejemplo, volveránull
en un navegador, peroundefined
con este simulacro, esto estaba causando que fallara una de mis pruebas. La solución simple para mí fue regresarstore[key] || null
a lagetItem
funciónlocalStorage['test'] = '123'; localStorage.getItem('test')
Si usa create-react-app, hay una solución más simple y directa explicada en la documentación .
Crea
src/setupTests.js
y pon esto en él:Contribución de Tom Mertz en un comentario a continuación:
Luego puede probar que las funciones de su LocalStorageMock se usan haciendo algo como
dentro de sus pruebas si quería asegurarse de que se llamara. Echa un vistazo a https://facebook.github.io/jest/docs/en/mock-functions.html
fuente
localStorage
que usa en su código. (si usacreate-react-app
y todos los scripts automáticos que proporciona naturalmente)expect(localStorage.getItem).toBeCalledWith('token')
oexpect(localStorage.getItem.mock.calls.length).toBe(1)
dentro de sus pruebas si desea asegurarse de que se haya llamado. Echa un vistazo a facebook.github.io/jest/docs/en/mock-functions.htmllocalStorage
? ¿No le gustaría reiniciar los espías después de cada prueba para evitar el "derrame" en otras pruebas?Actualmente (Oct '19) localStorage no puede ser burlado o espiado por broma como lo haría normalmente, y como se describe en los documentos de create-react-app. Esto se debe a los cambios realizados en jsdom. Puedes leer sobre esto en broma y jsdom rastreadores de problemas de .
Como solución alternativa, puede espiar el prototipo en su lugar:
fuente
jest.spyOn(window.localStorage.__proto__, 'setItem');
o simplemente tomas un paquete simulado como este:
https://www.npmjs.com/package/jest-localstorage-mock
no solo maneja la funcionalidad de almacenamiento, sino que también le permite probar si realmente se llamó a la tienda.
fuente
Una mejor alternativa que maneja
undefined
valores (no tienetoString()
) y devuelvenull
si el valor no existe.react
Probé esto con v15,redux
yredux-auth-wrapper
fuente
removeItem
: developer.mozilla.org/en-US/docs/Web/API/Storage/removeItemSi está buscando un simulacro y no un trozo, aquí está la solución que uso:
Exporto los elementos de almacenamiento para una fácil inicialización. IE puedo configurarlo fácilmente en un objeto
En las versiones más recientes de Jest + JSDom no es posible configurar esto, pero el almacenamiento local ya está disponible y puede espiarlo de esta manera:
fuente
Encontré esta solución de github
Puede insertar este código en sus SetupTests y debería funcionar bien.
Lo probé en un proyecto con typectipt.
fuente
Desafortunadamente, las soluciones que he encontrado aquí no funcionaron para mí.
Así que estaba mirando los problemas de Jest GitHub y encontré este hilo
Las soluciones más votadas fueron estas:
fuente
window
ni estánStorage
definidas. Tal vez es la versión anterior de Jest que estoy usando.Como @ ck4 la documentación sugerida tiene una explicación clara para usar
localStorage
en broma. Sin embargo, las funciones simuladas no podían ejecutar ninguna de laslocalStorage
métodos.A continuación se muestra el ejemplo detallado de mi componente de reacción que utiliza métodos abstractos para escribir y leer datos,
Error:
Solución:
Añadir a continuación la función simulacro de broma (ruta:
.jest/mocks/setUpStore.js
)Se hace referencia al fragmento desde aquí
fuente
Riffed algunas otras respuestas aquí para resolverlo para un proyecto con Typecript. Creé un LocalStorageMock como este:
Luego creé una clase LocalStorageWrapper que uso para todo el acceso al almacenamiento local en la aplicación en lugar de acceder directamente a la variable de almacenamiento local global. Facilitó la configuración del simulacro en el contenedor para las pruebas.
fuente
Crea un simulacro y
global
agrégalo al objetofuente
Puedes usar este enfoque para evitar burlarte.
fuente
Debes burlarte del almacenamiento local con estos fragmentos
// localStorage.js
Y en la configuración de broma:
Siéntase libre de preguntar cualquier cosa.
fuente
La siguiente solución es compatible para probar con configuraciones TypeScript, ESLint, TSLint y Prettier más estrictas
{ "proseWrap": "always", "semi": false, "singleQuote": true, "trailingComma": "es5" }
:HT / https://stackoverflow.com/a/51583401/101290 sobre cómo actualizar global.localStorage
fuente
Para hacer lo mismo en el mecanografiado, haga lo siguiente:
Configure un archivo con los siguientes contenidos:
Luego agrega la siguiente línea a su package.json en sus configuraciones de Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
O importa este archivo en su caso de prueba donde desea burlarse del almacenamiento local.
fuente
Esto funcionó para mí
fuente