Pourquoi est-ce que j'obtiens « TypeError : impossible de convertir la valeur du symbole en chaîne » lorsque j'essaie de créer un clone d'un magasin Vuex dans un test unitaire Jest ?
P粉604848588
P粉604848588 2023-08-26 16:06:50
0
1
497
<p>J'ai une application Vue 2.6 / Vuex 3.6 / TypeScript fonctionnelle. Je souhaite ajouter quelques tests unitaires avant de procéder à une refactorisation complexe. Une fois Jest et Vue Test Utils installés et configurés, j'ai essayé de suivre les instructions fournies dans le guide officiel de Vue Test Utils. </p> <p>Adapter les instructions à mon projet spécifique, comme ceci : </p> <pre class="brush:js;toolbar:false;">importer { createLocalVue } depuis '@vue/test-utils' importer Vuex depuis 'vue' importer un magasin depuis 'magasin' importer { cloneDeep } depuis 'lodash' test("SET_CURRENT_VTK_INDEX_SLICES devrait mettre à jour les tranches d'index VTK", () => { const localVue = créerLocalVue() localVue.use(Vuex) const store = nouveau Vuex.Store(cloneDeep(storeConfig)) attendre(store.state.iIndexSlice).toBe(0) store.commit('SET_CURRENT_VTK_INDEX_SLICES', { indexAxis : 'i', valeur : 1 }) }) ≪/pré> <p>Mais lorsque j'exécute <code>npm run test:unit</code>, j'obtiens l'erreur suivante : </p> <blockquote> <p>"TypeError : impossible de convertir la valeur du symbole en chaîne"</p> </blockquote> <p>Je ne pense pas qu'il y ait de symboles dans le magasin, mais utilisez une fonction récursive pour vérifier le magasin et tous ses enfants. (J'ai volé ce code quelque part dont je ne me souviens pas) : </p> <pre class="brush:js;toolbar:false;">function findSymbolInStore(store) { pour (clé const en magasin) { console.log(clé); if (store.hasOwnProperty(key)) { valeur const = magasin[clé] ; if (type de valeur === 'objet') { if (valeur instance du symbole) { console.log(`Symbole trouvé : ${key}`); } autre { findSymbolInStore(valeur); } } } } } findSymbolInStore(store.state); ≪/pré> <p>Aucun symbole trouvé dans le magasin.</p> <p>Je me suis retrouvé dans quelques impasses supplémentaires et j'ai essayé de chaîner le magasin pour voir où se trouvaient les symboles : </p> <pre class="brush:js;toolbar:false;">essayer { const thisStore = JSON.stringify(store); } attraper (erreur) { console.error('Erreur lors de la conversion de l'objet en chaîne;', err); } ≪/pré> <p>Mais cela renvoie l'erreur : </p> <blockquote> <p>Erreur de type : conversion de la structure de boucle en JSON</p> </blockquote> <p>Essayez ensuite de stringifier avec <code>flatted</code> : </p> <pre class="brush:js;toolbar:false;">importer aplati depuis 'flatted'; const stringifyStore = flatted.stringify(store); const parsedStore = flatted.parse(stringifyStore); ≪/pré> <p>Cela a semblé m'amener un peu plus loin et maintenant j'obtiens l'erreur : </p> <blockquote> <p>TypeError : Impossible de lire la propriété non définie (lire 'iIndexSlice')</p> </blockquote> <p>C'est étrange car je peux voir que <code>iIndexStore</code> a une valeur par défaut de 0 dans le magasin. Heureusement, à ce stade, Amit Patel m'a mis sur la bonne voie en soulignant que non seulement <code>iIndexSlice</code> n'était pas défini, mais que l'ensemble de <code>store.state</code> </p> <p>Je suis tombé sur un [problème Vuex GitHub][4] avec une erreur similaire à celle que j'ai rencontrée : </p> <blockquote> Les getters <p>[vuex] devraient être des fonctions, mais 'getters.currentView' est {}</p> </blockquote> <p>Dans la question citée ci-dessus, l'auteur recommande de ne pas exporter la boutique, mais uniquement la configuration de la boutique. J'ai réalisé que la boutique de l'application exportait une instance réelle de la boutique. La définition du stockage Vuex ressemble à ceci : </p> <pre class="brush:js;toolbar:false;">const store = new Vuex.Store({ État: { iIndexSlice : 0, //... }, getteurs : { vue actuelle (état) { // Code de fonction... } mutation : { //code }, Actions: { //code } }); exporter le magasin par défaut ; ≪/pré> <p>Mais et maintenant ? </p> <p>HT : À Mujeeb, qui m'a aidé avec un débogage symbolique. </p> <p> REMARQUE : j'aurais pu ignorer les impasses, etc., mais j'ai pensé que d'autres pourraient avoir la même difficulté et qu'il serait peut-être plus facile de rechercher la réponse sur Google si certains bugs, etc. étaient mentionnés. ≪/p >
P粉604848588
P粉604848588

répondre à tous(1)
P粉421119778

(Bienvenue dans un autre épisode de "Dave a passé trop de temps à résoudre ce problème... c'est très trivial, mais j'espère que ça sauvera une autre personne qui fera la même erreur" :

J'ai refactorisé la boutique Vuex comme ceci :

export const storeConfig = {
 state: {
  iIndexSlice: 0,
  // ...
 },
 getters: {
  currentView(state) {
   // Function code ...
  }
 mutations: {
  // code
 },
 actions: {
  // code
 }
};

const store = new Vuex.Store(storeConfig);

export default store;

Ensuite, j'ai juste dû apporter une petite modification au test Jest :

// import store from './store'
// to:
import { storeConfig } from './store'
})

Maintenant, le test se déroule sans problème.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!