You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jest+vue-test-utils测试依赖globalProperties的Vuex Action

解决Vuex Action测试中全局global.dashboards.$filters未定义问题

问题根源

你在jest.init.js中配置的config.global.mocks是给Vue组件测试用的,用于挂载组件时注入模拟的实例属性(比如this.$filters)。但你的Vuex Action是直接调用的独立函数,它直接访问全局的global.dashboards对象,不会走Vue组件的上下文,所以这个mock配置不会生效。

解决方案

方案1:直接在测试中模拟全局global.dashboards

在测试文件中,直接给Jest的global对象添加dashboards属性,模拟需要的$filters结构:

describe('test: actions', () => {
  // 在所有测试前初始化全局mock
  beforeEach(() => {
    global.dashboards = {
      $filters: {
        currency: (value) => value // 可根据测试需求自定义返回值,比如模拟货币格式化
      }
    };
  });

  // 测试后清理,避免影响其他测试用例
  afterEach(() => {
    delete global.dashboards;
  });

  it('buildReservationsTableData', () => {
    let data = actions.buildReservationsTableData(mockDataBefore);
    expect(data).toEqual(tableData);
  });
});

方案2:重构Action,降低全局依赖(推荐)

直接依赖全局对象不利于代码可维护性和测试灵活性,建议将$filters作为参数传入Action函数:

修改待测试的Action代码:

buildReservationsTableData(channelsData, filters = global.dashboards.$filters) {
  // ... 原有代码不变,仅把所有`global.dashboards.$filters`替换为`filters`
  if (key == "totalAmount"){
    record[key] = filters.currency(channelsData[idx][key]);
  }
  // ...
}

然后在测试中直接传入模拟的filters:

describe('test: actions', () => {
  it('buildReservationsTableData', () => {
    // 自定义模拟的filters逻辑
    const mockFilters = {
      currency: (val) => `$${val.toFixed(2)}`
    };
    let data = actions.buildReservationsTableData(mockDataBefore, mockFilters);
    expect(data).toEqual(tableData);
  });
});

方案3:如果是标准Vuex Action(带context)

如果你的Action是标准Vuex Action(第一个参数为context),可以在创建测试用Store时,将$filters注入到上下文:

import { createStore } from 'vuex';

describe('test: actions', () => {
  it('buildReservationsTableData', () => {
    const store = createStore({
      // ... 你的Store配置
      actions: {
        buildReservationsTableData(context, payload) {
          // 给context注入模拟的$filters
          context.$filters = {
            currency: (val) => val
          };
          return actions.buildReservationsTableData(context, payload);
        }
      }
    });

    // 调用Action并断言结果
    return store.dispatch('buildReservationsTableData', mockDataBefore)
      .then(data => {
        expect(data).toEqual(tableData);
      });
  });
});

总结

优先选择方案2重构代码,减少全局依赖,让测试更灵活;如果暂时无法重构,方案1可以快速解决测试报错问题。

内容的提问来源于stack exchange,提问作者Gabriella Tavares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:50:26