如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?

Posted

技术标签:

【中文标题】如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?【英文标题】:How to mock mixin during unit test using vue-test-utils and jest? 【发布时间】:2019-08-07 19:55:35 【问题描述】:

我想在 Test.vue 中测试 testMethod,但是 testMethod 使用了从 App.js 导入的 mixin。

Test.vue

<script>
    export default 
        methods: 
            testMethod() 
                return 'get'+this.getTestMixin();
            
        ,
    ;
</script>

mixins/common.js

export default 
    methods: 
        getTestMixin() 
            return 'test';
        ,
    ,
;

如何模拟 mixin?我试图像下面那样模拟 mixin 但失败了,知道我在哪里做错了吗?

function getTestMixin() 
    return 'test';


const localVue = createLocalVue()
localVue.mixin(getTestMixin)

const wrapper = shallowMount(Test, 
    localVue,
)

错误信息如下:

TypeError: Cannot read property 'props' of undefined
  46 | beforeEach(() => 
> 47 |  wrapper = shallowMount(Test, 
     |          ^
  48 |      localVue,
  49 |  );
  50 | );

【问题讨论】:

【参考方案1】:

如果在浅挂载之前替换 Mixin,则可以模拟它们。比如:

const localVue = createLocalVue();

const mockMixin = 
  methods: 
    mixinMethod() 
        return 'test';
    ,
  


const MockedTestComponent =  ...TestComponent, mixins: [mockMixin] ;

const wrapper = shallowMount(MockedTestComponent, 
  localVue,
);

expect(wrapper.vm.mixinMethod()).toEqual('test');

【讨论】:

【参考方案2】:

使用 Vue 3 并使用 Vue Test Utils,这只是使用 Jest 模拟单个方法的问题。

    const wrapper = mount(Test, 
        global: 
            mixins: [common],
        ,
     as any)

    jest.spyOn(wrapper.vm, 'getTestMixin').mockImplementation()

所以 testMethod() 的返回值将只是 'get'

请注意,Jest 模拟它而不关心该方法在 mixin 上,而不是在 Vue 组件上。

【讨论】:

以上是关于如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?

如何使用 vue-test-utils 和 Jest 在 Nuxt 中对使用 vuex-module-decorators 语法定义的 Vuex 模块进行单元测试?

vue-test-utils:如何在 mount() 生命周期钩子(使用 vuex)中测试逻辑?

VueJs 如何删除全局错误处理程序以使用 vue-test-utils 进行测试

带有 vue-test-utils 和 Jest 的 Vue.js 单元测试用例失败

基于Vue的Jest单元测试入门与实践