搜尋

首頁  >  問答  >  主體

無法在空的DOMWrapper上呼叫text的Vuejs單元測試問題

我正在使用 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>


#
P粉204136428P粉204136428513 天前771

全部回覆(1)我來回復

  • P粉697408921

    P粉6974089212023-11-01 13:16:58

    您正在測試Dashboard元件並嘗試檢查ATable)元件渲染了傳遞給的槽內容它。這是錯誤的。 考慮到 ATable 元件,在測試 Dashboard 元件時您應該檢查的是 ATable 元件是否剛剛渲染。就是這樣。

    // In Dashboard.spec.js
    it("renders ATable component.", () => {
      const ATableStub = {
        template: '<div>ATableStub</div>' 
      }
        const wrapper = shallowMount(Dashboard, {
          stubs: {
            ATable: ATableStub
          },
          data() {
            return {
              patients: [
                {
                  id: 1,
                  firstName: "arpit",
                  lastName: "satyal",
                  email: "arpited7@gmail.com",
                  contact: "12345",
                  address: "ktm",
                  dob: "1998-07-29",
                  allergies: ["Pet allergies"],
                },
              ] as IPatientResponse[],
            };
          },
        });
    wrapper.findComponent(ATableStub).exists.toBe(true);
      });
    });

    您應該將測試 ATable 的槽內容留給測試 ATable 元件,而不是儀表板 元件。

    // In ATable.spec.js
    import { shallowMount, RouterLinkStub } from '@vue/test-utils'
    
      it("renders proper texts.", () => {
        const wrapper = shallowMount(ATable, {
          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>`
          },
          data() {
            return {
              patients: [
                {
                  id: 1,
                  firstName: "arpit",
                  lastName: "satyal",
                  email: "arpited7@gmail.com",
                  contact: "12345",
                  address: "ktm",
                  dob: "1998-07-29",
                  allergies: ["Pet allergies"],
                },
              ] as IPatientResponse[],
            };
          },
        });
        const patientNameSelector = wrapper.find("#test-patient");
        // see if the message renders
        expect(patientNameSelector.text()).toEqual("arpit satyal");
      });
    });

    回覆
    0
  • 取消回覆