首页 > 解决方案 > 如何在没有直接访问的情况下模拟 vuex 函数?

问题描述

所以我遇到了一个相当大的测试问题。

总结:不久前我创建了一个私有 npm 模块,它管理和创建一个 vuex 存储并将其作为一个模块注入到主 vuex 存储中。

现在我想在我的测试中模拟该 vuex 模块的特定功能,但这不起作用。

我试过这个:

store.getters.getSomething = jest.fn(() => "stuff);

但这会导致此错误:

TypeError: Cannot set property getSomething of #<Object> which has only a getter

现在做了一点挖掘,我在这里你可以看到这个吸气剂来自哪里:

首先有一个简单的 vuex 模块定义:

//vuexModule  this is not accessible outside of the npm module
getters:{ 
      getSomething: (state)=>{ return "stuff"}
}
export { getters }

现在这被导入到这个类中:

//storeProvider  //this is exposed by the npm package
import vuexModule from "./vuexModule";

export default class StoreProvider {
  constructor(vuexStore, vuexModuleName = "someStore") {
    this.vuexStore = vuexStore;
    this.vuexStore.registerModule(vuexModuleName, VuexConfigStore);
}

所以这个类会使用之前定义的模块生成一个vuex模块。

现在整个东西被添加到实际应用程序的主 vuex 存储中。注意:此代码现在是实际的应用程序,而不是在 npm 包中。

import StoreProvider from "someNpmModule"; 
import mainStore from "vuexPlugin"; 

const storeProvider = new StoreProvider(store);

//later in main: 
new Vue({ mainStore })

所以问题是:我如何模拟 getSomething? 我知道代码非常抽象,但我无法显示所有代码,而且对于 stackoverflow 来说可能太多了。

重点是,我可以像这样导入 getter 并模拟它:

import {getSomething} from "..."; 
getSomething = jest.fn(() => "stuff);
//Or this: 
store.getters.getSomething = jest.fn(() => "stuff);

我发现了这个 stackoverflow 问题:Jest spyOn 期间的 TypeError: Cannot set property getRequest of #<Object> which has only a getter

但是由于 npm 包相当大,我不能只为单元测试模拟整个包,因为它提供了一些必要的先决条件。我尝试了 genMockFromModule(),但我仍然需要针对这个特定的函数。如前所述,我不能简单地导入该功能。

有任何想法吗?

标签: vue.jsjestjsvuexvue-test-utils

解决方案


推荐阅读