【问题标题】:How to test Vue component with a child Buefy input component?如何使用子 Buefy 输入组件测试 Vue 组件?
【发布时间】:2019-06-28 00:43:05
【问题描述】:

我有一个 LoginCard 组件,它使用 Buefy's b-input 组件来呈现电子邮件和密码输入:

<b-field label="Email">
  <b-input
    v-model="email"
    type="email"
    placeholder="Your email"
    required
  >
  </b-input>
</b-field>

<b-field label="Password">
  <b-input
    v-model="password"
    type="password"
    password-reveal
    placeholder="Your password"
    required
  >
  </b-input>
</b-field>

在我的测试中,我想使用类似vue-test-utilssetValue 的方法在输入上设置一个值,触发该输入,并让它传播到我的data 模型属性email 和@987654329 @。

wrapper.find('input[type="email"]').setValue('test@example.com');
wrapper.find('input[type="password"]').setValue('password');

但这不起作用,值不会被传播。

【问题讨论】:

  • 您的测试似乎正在验证b-input 将输入值传播到v-model。假设这是一个单元测试,那么验证似乎超出了范围。如果您只打算设置emailpassword,则可以直接初始化它们(通过wrapper.vm 或安装选项的propsData)。
  • 我的测试是验证如果用户在表单中输入他们的电子邮件和密码并提交表单,则使用该数据调用 loginWith 方法。这感觉就像一个单元测试,因为输入是用户名和密码。目前我正在使用setData 对其进行测试,但这感觉不对——感觉相当于在类上手动设置实例变量而不是使用类的api。

标签: vue.js vue-test-utils buefy


【解决方案1】:

我发现您需要使用 awaitPromises 函数来触发响应性并导致输入完全传播。

例如,我的最终测试如下所示:

it('Logs in user via form', async () => {
  const wrapper = mount(LoginCard, {
    mocks: { $auth: mockAuth }
  });

  const inputs = wrapper.findAll({ name: 'BInput' });

  expect(inputs.length).toEqual(2);

  wrapper.find('input[type="email"]').setValue(email);
  await flushPromises();

  wrapper.find('input[type="password"]').setValue(password);
  await flushPromises();

  wrapper.find('form').trigger('submit.prevent');
  await flushPromises();

  expect(strategy).toBe('local');
  expect(data).toEqual({
    data: { user: { email: email, password: password } }
  });
});

mockAuth 在哪里模拟 Nuxt 的全局 $auth:

const mockAuth = {
  loginWith: (_strategy, _data) => {
    return new Promise((resolve, reject) => {
      strategy = _strategy;
      data = _data;
      if (error) {
        reject(new Error(errorMessage));
      } else {
        resolve();
      }
    });
  }
};

它比我想要的更冗长,但我喜欢它使用简单的输入来测试所需的输出。

您也可以在触发表单提交之前使用wrapper.setData(...) 手动设置电子邮件和密码,但出于以下几个原因,我不喜欢这样:

  1. 您实际上是在设置一些私有变量来测试您的代码

  2. 您可以进入并删除输入元素,您的组件规范仍然可以通过,即使实际上它完全无法使用。

【讨论】:

  • 我的布局完全相同,您的解决方案运行良好,谢谢。我想知道为什么await wrapper.vm.$nextTick(); 不起作用。
  • 请分享您如何没有收到此警告 [Vue 警告]:未知自定义元素:
  • 导入 Buefy 并在构建你的 localVue 后执行 localVue.user(Buefy)
猜你喜欢
  • 1970-01-01
  • 2020-08-25
  • 2018-07-25
  • 2020-05-05
  • 2021-10-02
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多