Sinon Stub 不适用于导出函数

Seb*_*ten 7 javascript sinon sinon-chai

Sinon 似乎没有从导入的文件中存根方法。这与导出常量有关吗?

我在 console.log 中看到“已收到原始消息”。

Main.js

import * as otherActions from 'filters/actions/Other.actions';

describe('filter actions', () => {

    it('should log STUBBED MESSAGE', () => {   
      sinon.stub(otherActions, 'logMessage').callsFake(m => console.log('STUBBED Message'));
      const compiled = otherActions.doSomethingAndLogMessage(5, 5);
      compiled(message => console.log(`RECEIVED ${message}`), () => {});
    });

});
Run Code Online (Sandbox Code Playgroud)

其他.actions.js

export const logMessage = () => console.log("ORIGINAL MESSAGE");

export const doSomethingAndLogMessage = (categoryId, size) => (dispatch, getState) => {
  dispatch(logMessage());
};
Run Code Online (Sandbox Code Playgroud)

And*_*erg 5

出现此问题的原因是,当在模块上下文中引用该函数时,您正在对导出模块中的函数进行存根处理。从模块内部原始引用它时,您并没有存根。有很多方法可以解决这个问题,但我认为所有方法都需要您稍微更改一下生产代码。

一个建议是这样的:

其他.actions.js

export const logger = { message: () => console.log("ORIGINAL MESSAGE") };
Run Code Online (Sandbox Code Playgroud)

Main.js

import * as otherActions from 'filters/actions/Other.actions';

...
sinon.stub(otherActions.logger, 'message')
  .callsFake(m => console.log('STUBBED Message'));
Run Code Online (Sandbox Code Playgroud)

重要的是您在测试模块可用的上下文中创建存根。

另一个一般性评论是,通常,您不想在正在测试的模块中模拟或存根函数或方法。通常,单元测试的单元是指模块。因此,如果您发现需要在正在测试的同一模块中删除某些内容,那么我建议您的模块边界不正确。