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>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 >