Javascript 是否可以重新评估导入的ES6模块?

Javascript 是否可以重新评估导入的ES6模块?,javascript,jestjs,es6-modules,Javascript,Jestjs,Es6 Modules,我正在尝试为redux应用程序编写单元测试。我有一个常用的store.js: 从'redux'导入{createStore,applyMiddleware}; 从“redux thunk”导入thunk; 从“./root reducer”导入rootReducer; 导出默认的createStore(rootReducer、applyMiddleware(thunk)); 和测试文件: //必要的导入和模拟 描述('store',()=>{ 在每个之前(()=>{ redux.createS

我正在尝试为redux应用程序编写单元测试。我有一个常用的
store.js

从'redux'导入{createStore,applyMiddleware};
从“redux thunk”导入thunk;
从“./root reducer”导入rootReducer;
导出默认的createStore(rootReducer、applyMiddleware(thunk));
和测试文件:

//必要的导入和模拟
描述('store',()=>{
在每个之前(()=>{
redux.createStore.mockClear();
applyMiddleware.mockClear();
jest.resetModules()
});
它('应该正确创建存储',异步()=>{
const=jest.fn();
applyMiddleware.mockImplementation(()=>stubMiddleware);
等待导入('./存储');
期望(redux.createStore).toHaveBeenCalledTimes(1);
expect(redux.createStore).toHaveBeenCalledWith(rootReducer,stubMiddleware);
});
它('应该应用thunk中间件',异步()=>{
applyMiddleware.mockImplementation(()=>{});
等待导入('./存储');
预期(redux.applyMiddleware).已被调用时间(1);
期望(redux.applyMiddleware).与(thunk)一起调用;
});
});
不幸的是,第二个测试用例将失败,因为存储模块在第一次导入时只评估一次,并且我在每次测试后清除所有模拟

事实上,问题相当具体,但问题更广泛。我们有很多工具需要在模块中添加副作用,比如这里,创建一个商店。 如何测试这些副作用?我的第一个解决方案是导出一个
getStore()
方法,这是单例DP的一种实现,但在这种情况下,单例实例的模块是有状态的,在某些情况下可能需要重新评估


我也尝试过
jest.resetModules()
jest.isolateModules()
,但它们没有帮助。

与之类似,但
require
一般都没有这样做:只需将其放在函数中。在特定情况下,您有时可以控制模块加载程序,并可以使用技巧重新加载模块,就像开玩笑的测试。但是使用函数更简单,而且可以在任何地方使用。@Bergi我不太明白,它已经存在于函数中了,测试用例的第二个参数是一个函数。我的意思是,您应该将要重新计算的代码放入函数中,在本例中是
createStore(rootReducer,applyMiddleware(thunk))
。与之类似,但是
require
一般来说并没有做到这一点:只是将其放在函数中。在特定情况下,您有时可以控制模块加载程序,并可以使用技巧来重新加载模块,就像在玩笑中测试一样。但是使用函数更简单,而且可以在任何地方使用。@Bergi我不太明白,它已经存在于函数中了,测试用例的第二个参数是一个函数。我的意思是,您应该将要重新计算的代码放入函数中,在本例中是
createStore(rootReducer,applyMiddleware(thunk))