如何在没有直接访问的情况下模拟 vuex 函数?

时间:2021-03-11 13:03:07

标签: vue.js jestjs vuex vue-test-utils

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

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

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

我试过了:

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

但这会导致此错误:

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

现在做了一些挖掘,我在这里你可以看到这个 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 问题:TypeError during Jest's spyOn: Cannot set property getRequest of #<Object> which has only a getter

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

有什么想法吗?

0 个答案:

没有答案