【问题标题】:How to mock lifecycle hooks with vue-test-utils如何使用 vue-test-utils 模拟生命周期钩子
【发布时间】:2019-01-18 17:11:24
【问题描述】:

方法一:

const mixin = {
  beforeCreate() {
    // do something
  }
}

mount(TestComponent, {
  mixins: [mixin]
})

以及方法二:

const mixin = {
  beforeCreate() {
    // do something
  }
}

localVue = createLocalVue()
localVue.mixin(mixin)

mount(TestComponent, {
  localVue
})

这两种方法都不适合我。我收到一个错误:在开发环境和 CodeSandbox 上无法读取未定义的属性 'props'。 https://codesandbox.io/s/4031x2r769

如何正确模拟生命周期钩子?

【问题讨论】:

    标签: vue.js vue-test-utils


    【解决方案1】:

    您的示例是正确的,但您的 CodeSandbox 混合语法不正确(它应该是一个对象)。但主要问题是 mixin 生命周期钩子在 before 组件钩子之前调用,因此您的 msg 分配被组件覆盖(请参阅 mixin 合并 docs)。

    例如,如果您将 mixin 中的 created 更改为 mounted,那么它将被传递,因为 HelloWorld 不会更改该钩子中的 msg 字段(或钩子不存在)。

    有来自 CodeSandbox 的固定测试代码:

    import { expect } from "chai";
    import { mount, createLocalVue } from "@vue/test-utils";
    import HelloWord from "../src/components/HelloWorld.vue";
    
    describe("test mocks", () => {
      const localVue = createLocalVue();
    
      const msg = "from mock";
      let mixin = {
        // change hook to "later" one to  make it work
        mounted() {
          this.msg = msg;
        }
      }
    
      localVue.mixin(mixin);
    
      const wrapper = mount(HelloWord, {
        localVue
      });
    
      it("hook created", () => {
        expect(wrapper.vm.msg).eq(msg);
      });
    });
    

    【讨论】:

    • 我在组件中添加了mounted方法,它没有被mixin覆盖
    • Mixin 不能覆盖组件生命周期钩子,它只是在组件一之前调用。我在示例中将 mounted 钩子添加到 mixin 中,因为 mouted 调用晚于组件的 created 钩子。
    • 不是这个问题的答案。
    猜你喜欢
    • 2018-10-21
    • 2021-06-12
    • 1970-01-01
    • 2018-09-01
    • 2018-04-23
    • 2019-11-19
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多