Mengapa saya mendapat "TypeError: tidak boleh menukar nilai simbol kepada rentetan" apabila saya cuba mencipta klon kedai Vuex dalam ujian unit Jest?
<p>Saya mempunyai aplikasi Vue 2.6 / Vuex 3.6 / TypeScript yang berfungsi. Saya ingin menambah beberapa ujian unit sebelum melakukan beberapa pemfaktoran semula yang kompleks. Setelah saya memasang dan mengkonfigurasi Jest dan Uti Ujian Vue, saya cuba mengikut arahan yang diberikan dalam panduan Uti Ujian Vue rasmi. </p>
<p>Suaikan arahan kepada projek khusus saya, seperti ini: </p>
<pre class="brush:js;toolbar:false;">import { createLocalVue } daripada '@vue/test-utils'
import Vuex daripada 'vue'
import kedai dari 'kedai'
import { cloneDeep } daripada 'lodash'
ujian("SET_CURRENT_VTK_INDEX_SLICES hendaklah mengemas kini kepingan indeks VTK", () => {
const localVue = createLocalVue()
localVue.use(Vuex)
kedai const = Vuex.Store baharu(cloneDeep(storeConfig))
jangkakan(store.state.iIndexSlice).toBe(0)
store.commit('SET_CURRENT_VTK_INDEX_SLICES', { indexAxis: 'i', value: 1 })
})
</pra>
<p>Tetapi apabila saya melaksanakan <kod>npm menjalankan ujian:unit</code>
<blockquote>
<p>"TypeError: tidak boleh menukar nilai simbol kepada rentetan"</p>
</blockquote>
<p>Saya tidak fikir terdapat sebarang simbol dalam kedai, tetapi gunakan fungsi rekursif untuk menyemak kedai dan semua anak-anaknya. (Saya mencuri kod ini dari tempat yang saya tidak ingat): </p>
<pre class="brush:js;toolbar:false;">function findSymbolInStore(store) {
untuk (kunci const di kedai) {
console.log(kunci);
if (store.hasOwnProperty(key)) {
nilai const = kedai[kunci];
if (jenis nilai === 'objek') {
if (nilai instanceof Symbol) {
console.log(`Simbol ditemui: ${key}`);
} lain {
findSymbolInStore(nilai);
}
}
}
}
}
findSymbolInStore(store.state);
</pra>
<p>Tiada simbol ditemui dalam kedai.</p>
<p>Saya menemui beberapa lagi jalan buntu dan cuba merangkai kedai untuk melihat di mana simbol itu: </p>
<pre class="brush:js;toolbar:false;">cuba {
const thisStore = JSON.stringify(store);
} tangkap (err) {
console.error('Ralat menukar objek kepada rentetan;', err);
}
</pra>
<p>Tetapi ini menimbulkan ralat: </p>
<blockquote>
<p>Ralat jenis: menukar struktur gelung kepada JSON</p>
</blockquote>
<p>Kemudian cuba rentetan dengan <kod>diratakan</kod>: </p>
<pre class="brush:js;toolbar:false;">import diratakan daripada 'diratakan';
const stringifyStore = flatted.stringify(store);
const parsedStore = flatted.parse(stringifyStore);
</pra>
<p>Ini nampaknya membawa saya selangkah lebih jauh dan kini saya mendapat ralat: </p>
<blockquote>
<p>TypeError: Tidak dapat membaca sifat yang tidak ditentukan (baca 'iIndexSlice')</p>
</blockquote>
<p>Ini adalah pelik kerana saya dapat melihat bahawa <code>iIndexStore</code> mempunyai nilai lalai 0 dalam kedai. Syukurlah, pada ketika ini Amit Patel membawa saya ke landasan yang betul dengan menunjukkan bahawa bukan sahaja <code>iIndexSlice</code> tidak ditentukan, tetapi keseluruhan <code>store.state</code> </p>
<p>Saya terjumpa [isu Vuex GitHub][4] dengan ralat yang serupa dengan yang saya temui: </p>
<blockquote>
<p>[vuex] getter sepatutnya menjadi fungsi, tetapi 'getters.currentView' ialah {}</p>
</blockquote>
<p>Dalam soalan yang dipetik di atas, pengarang mengesyorkan supaya tidak mengeksport kedai, tetapi hanya konfigurasi kedai. Saya menyedari bahawa kedai apl itu mengeksport contoh kedai sebenar. Definisi storan Vuex kelihatan seperti ini: </p>
<pre class="brush:js;toolbar:false;">const store = Vuex.Store baharu({
nyatakan: {
iIndexSlice: 0,
// ...
},
pengambil: {
currentView(state) {
// Kod fungsi ...
}
mutasi: {
// kod
},
tindakan: {
// kod
}
});
eksport kedai lalai;
</pra>
<p>Tetapi bagaimana sekarang? </p>
<p>HT: Kepada Mujeeb, yang membantu saya dengan beberapa penyahpepijatan simbolik. </p>
<p> NOTA: Saya boleh melangkau jalan buntu dan lain-lain, tetapi saya fikir orang lain mungkin mengalami kesukaran yang sama dan mungkin lebih mudah untuk menggoogle jawapannya jika beberapa pepijat dll disebut. </p >