Warum erhalte ich „TypeError: Symbolwert kann nicht in Zeichenfolge konvertiert werden', wenn ich versuche, in einem Jest-Komponententest einen Klon eines Vuex-Stores zu erstellen?
P粉604848588
2023-08-26 16:06:50
<p>Ich habe eine funktionierende Vue 2.6 / Vuex 3.6 / TypeScript-Anwendung. Ich möchte einige Komponententests hinzufügen, bevor ich eine komplexe Umgestaltung durchführe. Nachdem ich Jest und Vue Test Utils installiert und konfiguriert hatte, versuchte ich, den Anweisungen im offiziellen Vue Test Utils-Handbuch zu folgen. </p>
<p>Passen Sie die Anweisungen wie folgt an mein spezifisches Projekt an: </p>
<pre class="brush:js;toolbar:false;">import { createLocalVue } from '@vue/test-utils'
Vuex aus 'vue' importieren
Shop aus „Store“ importieren
importiere { cloneDeep } aus 'lodash'
test("SET_CURRENT_VTK_INDEX_SLICES sollte die VTK-Index-Slices aktualisieren", () => {
const localVue = createLocalVue()
localVue.use(Vuex)
const store = new Vuex.Store(cloneDeep(storeConfig))
erwarten(store.state.iIndexSlice).toBe(0)
store.commit('SET_CURRENT_VTK_INDEX_SLICES', { indexAxis: 'i', value: 1 })
})
</pre>
<p>Aber wenn ich <code>npm run test:unit</code> ausführe, erhalte ich die folgende Fehlermeldung: </p>
<blockquote>
<p>"TypeError: Symbolwert kann nicht in String konvertiert werden"</p>
</blockquote>
<p>Ich glaube nicht, dass der Speicher irgendwelche Symbole enthält, aber ich verwende eine rekursive Funktion, um den Speicher und alle seine untergeordneten Elemente zu überprüfen. (Ich habe diesen Code von irgendwoher gestohlen, an den ich mich nicht erinnere): </p>
<pre class="brush:js;toolbar:false;">function findSymbolInStore(store) {
for (const key in store) {
console.log(key);
if (store.hasOwnProperty(key)) {
const value = store[key];
if (typeof value === 'object') {
if (Wertinstanz des Symbols) {
console.log(`Symbol gefunden: ${key}`);
} anders {
findSymbolInStore(value);
}
}
}
}
}
findSymbolInStore(store.state);
</pre>
<p>Keine Symbole im Shop gefunden.</p>
<p>Ich bin in ein paar weitere Sackgassen geraten und habe versucht, den Laden mit Strings zu versehen, um zu sehen, wo sich die Symbole befanden: </p>
<pre class="brush:js;toolbar:false;">try {
const thisStore = JSON.stringify(store);
} Catch (Err) {
console.error('Fehler beim Konvertieren des Objekts in einen String;', err);
}
</pre>
<p>Aber dies löst den Fehler aus: </p>
<blockquote>
<p>Typfehler: Schleifenstruktur in JSON konvertieren</p>
</blockquote>
<p>Versuchen Sie es dann mit der Stringifizierung mit <code>flatted</code>: </p>
<pre class="brush:js;toolbar:false;">flatted from 'flatted' importieren;
const stringifyStore = flatted.stringify(store);
const parsedStore = flatted.parse(stringifyStore);
</pre>
<p>Das schien mich einen Schritt weiter zu bringen und jetzt erhalte ich die Fehlermeldung: </p>
<blockquote>
<p>TypeError: Eigenschaft von undefiniert kann nicht gelesen werden (lesen Sie „iIndexSlice“)</p>
</blockquote>
<p>Das ist seltsam, weil ich sehe, dass <code>iIndexStore</code> einen Standardwert von 0 hat. Zum Glück brachte mich Amit Patel an diesem Punkt auf den richtigen Weg, indem er darauf hinwies, dass nicht nur <code>iIndexSlice</code> undefiniert war, sondern auch der gesamte <code>store.state</code> </p>
<p>Ich bin auf ein [Vuex GitHub-Problem][4] mit einem ähnlichen Fehler gestoßen wie der, auf den ich gestoßen bin: </p>
<blockquote>
<p>[vuex] Getter sollten Funktionen sein, aber 'getters.currentView' ist {}</p>
</blockquote>
<p>In der oben zitierten Frage empfiehlt der Autor, nicht den Store zu exportieren, sondern nur die Konfiguration des Stores. Mir wurde klar, dass der Store der App eine tatsächliche Store-Instanz exportierte. Die Vuex-Speicherdefinition sieht folgendermaßen aus: </p>
<pre class="brush:js;toolbar:false;">const store = new Vuex.Store({
Zustand: {
iIndexSlice: 0,
// ...
},
Getter: {
currentView(state) {
// Funktionscode ...
}
Mutationen: {
// Code
},
Aktionen: {
// Code
}
});
Standardspeicher exportieren;
</pre>
<p>Aber was nun? </p>
<p>HT: An Mujeeb, der mir beim symbolischen Debuggen geholfen hat. </p>
<p> HINWEIS: Ich hätte die Sackgassen usw. überspringen können, aber ich dachte, andere hätten möglicherweise die gleichen Schwierigkeiten und es wäre möglicherweise einfacher, die Antwort zu googeln, wenn einige Fehler usw. erwähnt würden. </p>
(欢迎观看“戴夫花了太多时间来解决这个问题......这非常微不足道,但希望能拯救另一个会犯同样错误的人”的另一集:
我重构了 Vuex 商店,如下所示:
然后我只需要对 Jest 测试进行一点小小的调整:
现在测试运行没有问题。