我正在使用 vue test utils 來測試元件,並在嘗試測試文字時收到此錯誤。無法在空 DOMWrapper 上呼叫文字。
更新了程式碼。 在 atable.spec.ts 測試中出現「 RangeError:超出最大呼叫堆疊大小」。
atable.spec.ts
import ATable from "../components/ATable.vue"; import { IPatientResponse } from "@/types/patients"; import { shallowMount, RouterLinkStub } from "@vue/test-utils"; it("renders proper texts.", () => { const wrapper = shallowMount(ATable, { props: { patients: [ { id: 1, firstName: "arpit", lastName: "satyal", email: "arpited7@gmail.com", contact: "12345", address: "ktm", dob: "1998-07-29", allergies: ["Pet allergies"], }, ] as IPatientResponse[], }, stubs: { RouterLink: RouterLinkStub, }, scopedSlots: { bodyCell: ` <template slot-scope="{ column, record }" v-if="column.key === 'firstName'"> <router-link :to="{ name: 'PatientProfile', params: { id: record.id } }"> <div id="test-patient">{{ record.firstName }} {{ record.lastName }}</div> </router-link> </template>`, } }); const patientNameSelector = wrapper.find("#test-patient"); // see if the message renders expect(patientNameSelector.text()).toEqual("arpit satyal"); });
表格視圖 將表組件重構為它自己的元件。它現在從儀表板組件接收道具。
<!-- eslint-disable vue/multi-word-component-names --> <template> <section> <a-table :columns="columns" :data-source="patients" :pagination="false"> <template #bodyCell="{ column, record }"> <template v-if="column.key === 'firstName'"> <router-link :to="{ name: 'PatientProfile', params: { id: record.id } }"> <span id="test-patient">{{ record.firstName }} {{ record.lastName }}</span> </router-link> </template> <template v-else-if="column.key === 'specialAttention'"> <span class="pointer"> <EyeOutlined v-if="record.specialAttention" @click="markAsSpecial(record, false)" class="iconStyle" /> <EyeInvisibleOutlined v-else @click="markAsSpecial(record, true)" class="iconStyle" /> </span> </template> <template v-else-if="column.key === 'action'"> <span class="pointer"> <router-link :to="{ name: 'UpdatePatient', params: { id: record.id } }"> <EditOutlined style="margin-right: 10px" class="iconStyle" /> </router-link> <a-divider type="vertical" /> <DeleteOutlined @click="deletePatient(record.id)" class="iconStyle" /> <a-divider type="vertical" /> </span> </template> </template> </a-table> </section> </template> <script lang="ts"> import { EditOutlined, DeleteOutlined, EyeInvisibleOutlined, EyeOutlined, } from "@ant-design/icons-vue"; import { defineComponent } from "@vue/runtime-core"; const columns = [ { title: "Name", dataIndex: "firstName", key: "firstName", align: "center", }, { title: "Contact", dataIndex: "contact", key: "contact", align: "center", }, { title: "Address", dataIndex: "address", key: "address", align: "center", }, { title: "DOB", key: "dob", dataIndex: "dob", align: "center", }, { title: "Special Attention", key: "specialAttention", align: "center", }, { title: "Actions", key: "action", align: "center", }, ]; export default defineComponent({ props: ["deletePatient", "markAsSpecial", "patients"], components: { EditOutlined, DeleteOutlined, EyeInvisibleOutlined, EyeOutlined, }, data() { return { columns, }; }, }); </script>
您正在測試Dashboard元件並嘗試檢查ATable(
)元件渲染了傳遞給的槽內容它。這是錯誤的。 考慮到 ATable 元件,在測試 Dashboard 元件時您應該檢查的是 ATable 元件是否剛剛渲染。就是這樣。您應該將測試 ATable 的槽內容留給測試 ATable 元件,而不是儀表板 元件。