为啥用 Vuex 测试 Vue 组件时需要 createLocalVue?

Posted

技术标签:

【中文标题】为啥用 Vuex 测试 Vue 组件时需要 createLocalVue?【英文标题】:Why is createLocalVue needed when testing Vue components with Vuex?为什么用 Vuex 测试 Vue 组件时需要 createLocalVue? 【发布时间】:2020-09-30 09:58:22 【问题描述】:

我正在阅读 Vue Testing Cookbook 和 Vue Test Utils's docs,他们在其中涉及使用 Vuex 测试组件。两个消息来源都建议使用createLocalVue,但我不完全理解为什么。我们已经有几个使用 Vuex 但不使用 createLocalVue 的测试,它们可以工作。 那么为什么这些消息来源建议使用createLocalVue

根据这些来源,这里的测试似乎是一种不好的做法。这段代码会在未来破坏一些东西吗?它是否会导致我们不知道的不良副作用?

import  mount  from '@vue/test-utils';
import Vuex from 'vuex';
import Component from 'somewhere';

// We don't use this and yet the code seems to work
// const localVue = createLocalVue()
// localVue.use(Vuex)

describe('Foo Component', () => 
    let wrapper;

    beforeEach(() => 
        wrapper = mount(Component, 
            // localVue, <-- We don't use this
            store: new Vuex.Store(
                modules: 
                    app: 
                        namespaced: true,
                        // ... more store stuff
                    
                
            ) 
        )
    );

    it('should contain foo', () => 
        expect(wrapper.contains('.foo')).toBe(true);
    );
);

【问题讨论】:

【参考方案1】:

来自docs:

localVue:由createLocalVue 创建的 Vue 的本地副本,用于安装组件。在这个 Vue 副本上安装插件可以防止污染原始 Vue 副本。

在您的测试中,您可能希望在测试的 Vue 实例上进行特定更改并安装插件。使用 localVue 可确保每次测试都重置这些更改。

一个明显的优势是您不必为所有测试安装所有插件。所以你的测试会更快。

另外,当你的测试变得有点复杂时,如果你不使用localVue,你会遇到测试根据它们的顺序不规律地失败,因为之前运行的测试,即使它通过了,也修改了 Vue 实例以某种方式打破你的下一个测试。但是下一个测试在单独运行时通过。 通常意味着脱发的错误类型。

使用localVue 提供了一种大多数开发人员在运行测试时都欢迎的确定性。如果您喜欢冒险,请不要使用它。

这是建议,而不是强制。

【讨论】:

您能否详细说明什么样的测试序列会失败?我在每次测试中都创建一个新商店。 不幸的是,我不能。我在 1 年多前才遇到过这种类型的错误,当时我参与的一个更复杂的 Vue 项目。因为它迫使我们提高编码标准的标准,所以我们最近没有遇到过这种类型的错误,所以我手头没有实际的例子。 但我可以向你保证的是,这是因为我使用的是相同的 Vue 原型,一旦我开始使用 localVue,我就摆脱了这些错误。症状很容易描述:测试在单独运行时通过,但在顺序运行时失败。 我很好奇这是否特定于不会为每个测试启动新会话的特定测试工具。但无论如何我们都应该采用最佳实践,以防我们切换到新的测试工具。

以上是关于为啥用 Vuex 测试 Vue 组件时需要 createLocalVue?的主要内容,如果未能解决你的问题,请参考以下文章

在 vue-multiselect 中测试 vuex 操作时调用了 Jest 预期的模拟函数

使用 Vuex 对 VueJS 组件进行单元测试时出错

测试是不是使用特定参数(来自组件)调用了 Vuex 操作

Vue,vuex:如何使用命名空间存储和模拟对组件进行单元测试?

vuex

如何在 Vue 组件中测试对 Vuex Mutation 的调用?