所以我遇到了一个相当大的测试问题。
总结: 不久前,我创建了一个私有的 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(),但我仍然需要针对此特定功能。 如前所述,我不能简单地导入函数。
有什么想法吗?