Je continue à obtenir "localStorage n'est pas défini" dans les tests Jest, ce qui a du sens, mais quelles sont mes options? Frapper les murs de briques.
144
Excellente solution de @chiedo
Cependant, nous utilisons la syntaxe ES2015 et j'ai trouvé que c'était un peu plus propre de l'écrire de cette façon.
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 + ''
dans le setter pour gérer correctement les valeurs nulles et non définies|| null
c'est pourquoi mon test a échoué, car dans mon test, j'utilisaisnot.toBeDefined()
. Solution @Chiedo le faire fonctionner à nouveauJe l'ai compris avec l'aide de ceci: https://groups.google.com/forum/#!topic/jestjs/9EPhuNWVYTg
Configurez un fichier avec le contenu suivant:
Ensuite, vous ajoutez la ligne suivante à votre package.json sous vos configs Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
la source
"setupFiles": [...]
fonctionne aussi bien. Avec l'option array, permet de séparer les simulacres en fichiers séparés. Ex:"setupFiles": ["<rootDir>/__mocks__/localStorageMock.js"]
getItem
diffère légèrement de ce qui serait renvoyé par un navigateur si aucune donnée n'est définie sur une clé spécifique. appelergetItem("foo")
quand il n'est pas défini retournera par exemplenull
dans un navigateur, maisundefined
par ce simulacre - cela provoquait l'échec d'un de mes tests. La solution simple pour moi était de revenirstore[key] || null
dans lagetItem
fonctionlocalStorage['test'] = '123'; localStorage.getItem('test')
Si vous utilisez create-react-app, il existe une solution plus simple et directe expliquée dans la documentation .
Créez
src/setupTests.js
et mettez-y ceci:Contribution de Tom Mertz dans un commentaire ci-dessous:
Vous pouvez ensuite tester que les fonctions de votre localStorageMock sont utilisées en faisant quelque chose comme
à l'intérieur de vos tests si vous vouliez vous assurer qu'il a été appelé. Découvrez https://facebook.github.io/jest/docs/en/mock-functions.html
la source
localStorage
vous utilisez dans votre code. (si vous utilisezcreate-react-app
et tous les scripts automatiques qu'il fournit naturellement)expect(localStorage.getItem).toBeCalledWith('token')
ou à l'expect(localStorage.getItem.mock.calls.length).toBe(1)
intérieur de vos tests si vous vouliez vous assurer qu'il a été appelé. Découvrez facebook.github.io/jest/docs/en/mock-functions.htmllocalStorage
? Ne voudriez-vous pas réinitialiser les espions après chaque test pour éviter un «débordement» dans d'autres tests?Actuellement (octobre 19) localStorage ne peut pas être ridiculisé ou espionné par plaisanterie comme vous le feriez habituellement, et comme indiqué dans la documentation de create-react-app. Cela est dû aux modifications apportées à jsdom. Vous pouvez en savoir plus dans le trackers de problèmes jest et jsdom .
Pour contourner le problème, vous pouvez à la place espionner le prototype:
la source
jest.spyOn(window.localStorage.__proto__, 'setItem');
ou vous prenez simplement un faux paquet comme celui-ci:
https://www.npmjs.com/package/jest-localstorage-mock
il gère non seulement la fonctionnalité de stockage, mais vous permet également de tester si le magasin a été réellement appelé.
la source
Une meilleure alternative qui gère les
undefined
valeurs (elle n'a pastoString()
) et retournenull
si la valeur n'existe pas. Testé ceci avec lareact
v15,redux
etredux-auth-wrapper
la source
removeItem
: developer.mozilla.org/en-US/docs/Web/API/Storage/removeItemSi vous recherchez une maquette et non un talon, voici la solution que j'utilise:
J'exporte les éléments de stockage pour une initialisation facile. IE je peux facilement le définir sur un objet
Dans les nouvelles versions de Jest + JSDom, il n'est pas possible de définir cela, mais le stockage local est déjà disponible et vous pouvez l'espionner comme ceci:
la source
J'ai trouvé cette solution de github
Vous pouvez insérer ce code dans vos setupTests et cela devrait fonctionner correctement.
Je l'ai testé dans un projet avec typesctipt.
la source
Malheureusement, les solutions que j'ai trouvées ici n'ont pas fonctionné pour moi.
Donc, je regardais les problèmes de Jest GitHub et j'ai trouvé ce fil
Les solutions les plus appréciées étaient celles-ci:
la source
window
niStorage
défini ni défini. C'est peut-être l'ancienne version de Jest que j'utilise.Comme @ ck4 l'a suggéré, la documentation a une explication claire de l'utilisation
localStorage
dans jest. Cependant, les fonctions simulées ne parvenaient à exécuter aucune deslocalStorage
méthodes.Vous trouverez ci-dessous l'exemple détaillé de mon composant react qui utilise des méthodes abstraites pour écrire et lire des données,
Erreur:
Correction:
Ajouter ci - dessous pour fonction simulée plaisanterie (chemin:
.jest/mocks/setUpStore.js
)L'extrait est référencé à partir d' ici
la source
Vous pouvez utiliser cette approche pour éviter de vous moquer.
la source
Riffé quelques autres réponses ici pour le résoudre pour un projet avec Typescript. J'ai créé un LocalStorageMock comme ceci:
Ensuite, j'ai créé une classe LocalStorageWrapper que j'utilise pour tous les accès au stockage local dans l'application au lieu d'accéder directement à la variable de stockage local globale. Facilité de mise en place de la maquette dans l'emballage pour les tests.
la source
Créez une maquette et ajoutez-la à l'
global
objetla source
Vous devez simuler le stockage local avec ces extraits
// localStorage.js
Et dans la configuration de plaisanterie:
N'hésitez pas à demander quoi que ce soit.
la source
La solution suivante est compatible pour les tests avec une configuration TypeScript, ESLint, TSLint et Prettier plus stricte
{ "proseWrap": "always", "semi": false, "singleQuote": true, "trailingComma": "es5" }
:HT / https://stackoverflow.com/a/51583401/101290 pour savoir comment mettre à jour global.localStorage
la source
Pour faire la même chose dans le TypeScript, procédez comme suit:
Configurez un fichier avec le contenu suivant:
Ensuite, vous ajoutez la ligne suivante à votre package.json sous vos configs Jest
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
Ou vous importez ce fichier dans votre scénario de test où vous souhaitez simuler le stockage local.
la source
Cela a fonctionné pour moi,
la source