Skip to content

ElementUI 输入框测试(ElementUIInput.spec.js)

js
// src/components/__tests__/ElementUIInput.spec.js
import { mount } from "@vue/test-utils";
import { Input } from "element-ui";
import Vue from "vue";
import ElementUI from "element-ui";
import flushPromises from "flush-promises";
// 全局注册注册 Element UI
Vue.use(ElementUI);

describe("Element-UI Input组件基础测试", () => {
  // 测试用例1:基础渲染测试
  test("Input组件能够正常渲染", () => {
    const wrapper = mount(Input);
    // 验证组件存在且可见
    expect(wrapper.exists()).toBe(true);
    expect(wrapper.isVisible()).toBe(true);
    // 验证渲染的是输入框(Element Input 会渲染为原生input或textarea)
    expect(
      wrapper.find("input").exists() || wrapper.find("textarea").exists()
    ).toBe(true);
  });

  // 测试用例2:placeholder属性测试
  test("Input组件正确显示placeholder", () => {
    const placeholderText = "请输入用户名";
    const wrapper = mount(Input, {
      propsData: {
        placeholder: placeholderText,
      },
    });
    // 验证placeholder属性是否正确设置
    expect(wrapper.find("input").attributes("placeholder")).toBe(
      placeholderText
    );
  });

  // 测试用例3:双向绑定(v-model)测试
  test("Input组件支持v-model双向绑定", async () => {
    // 创建一个包含Input的父组件,模拟v-model
    const ParentComponent = Vue.component("ParentComponent", {
      template: `<el-input v-model="inputValue"></el-input>`,
      data() {
        return { inputValue: "" };
      },
    });

    const wrapper = mount(ParentComponent);
    const inputEl = wrapper.find("input");

    // 模拟用户输入
    const testValue = "测试双向绑定";
    await inputEl.setValue(testValue);

    // 验证父组件数据是否同步更新
    expect(wrapper.vm.inputValue).toBe(testValue);
  });

  // 测试用例4:输入事件(input)触发测试
  test("Input组件输入时触发input事件", async () => {
    const handleInput = jest.fn();
    const wrapper = mount(Input, {
      listeners: {
        input: handleInput,
      },
    });

    // 模拟输入内容
    const testValue = "触发事件";
    await wrapper.find("input").setValue(testValue);

    // 验证事件是否触发,且参数正确
    expect(handleInput).toHaveBeenCalledTimes(1);
    expect(handleInput).toHaveBeenCalledWith(testValue);
  });

  // 测试用例5:禁用状态测试
  test("Input组件禁用状态正常工作", () => {
    const wrapper = mount(Input, {
      propsData: {
        disabled: true,
      },
    });

    const inputEl = wrapper.find("input");
    // 验证禁用属性
    expect(inputEl.attributes("disabled")).toBe("disabled");
    // 验证禁用样式类
    expect(wrapper.classes()).toContain("is-disabled");
  });

  // 测试用例6:密码框类型测试
  test("Input组件设置show-password后显示为密码框", () => {
    const wrapper = mount(Input, {
      propsData: {
        showPassword: true,
      },
    });

    // 验证input类型是否为password
    expect(wrapper.find("input").attributes("type")).toBe("password");
  });

  // 测试用例7:清空功能测试(修复版)
  test("Input组件启用clearable后可清空内容", async () => {
    const wrapper = mount(Input, {
      propsData: {
        clearable: true,
        value: "可清空的内容", // 初始值
      },
    });

    const inputEl = wrapper.find("input");

    // 步骤1:验证初始值存在
    expect(inputEl.element.value).toBe("可清空的内容");
    return;
    // 步骤2:模拟输入框获取焦点(触发清空按钮显示)
    await inputEl.trigger("focus");

    // await flushPromises(); // 等待清空按钮显示
    // 步骤3:此时清空按钮才会出现,再点击清空按钮
    const clearBtn = wrapper.find(".el-input__clear");
    expect(clearBtn.exists()).toBe(true); // 先确认按钮已显示
    await clearBtn.trigger("click");

    // 步骤4:验证内容已清空
    setTimeout(() => {
      expect(inputEl.element.value).toBe("");
    });
  });
});

Released under the MIT License.