【问题标题】:sinonjs - stub a library referenced internally as a function using node modules (no require)sinonjs - 使用节点模块将内部引用为函数的库存根(不需要)
【发布时间】:2021-11-09 02:54:36
【问题描述】:

我有一个导出为函数的外部库,在Stub documentation 它只接受第一个参数作为对象和第二个参数作为方法的输入,所以我如何存根导出为在 Node ES Modules 环境中运行(没有 Commonjs)?

(在我的具体情况下,我使用了一个使用互联网工作的库,我想在不访问互联网的情况下测试派生函数,所以我想存根外部函数库)

尝试:

  • 我不能使用像 proxyquire 这样的解决方案,因为它是基于 requiremodule cache deletion 的解决方案,Node 的 ES 模块不支持这些解决方案。
  • 我不想用proxyquire-universal,因为它模拟了require在普通ES中的操作,而且它只是整个项目中我想测试的一个函数,我正在寻找一个更简单的解决方案李>
  • 更改导入模式不起作用,因为它不像babel 那样重新编译,所以即使我导入为import * as obj from 'lib',也只会更改函数名称

我的错误环境有 3 个文件:

例如一个名为“sum”的外部库,我不想更改,导出如下:

外部库:externalSum.js

module.exports = function sum(a, b){
  console.log(">>>>> running without stub <<<<<")
  return a + b
}

这个库在名为 mathProblems 的项目文件中间使用

内部文件:mathProblems.js

import sum from 'externalSum'

export function sumMore1(a) {
  return sum(a, 1);
}

我有一个测试文件

内部文件:spec.js

import sinon from 'sinon'
import assert from 'assert'
import sumObj from 'externalSum'
import { sumMore1 } from '../mathProblems.js'

describe('sumMore1 is working', () => {
  it('sumMore1 test', () => {
    const sum_stub = sinon.stub(sumObj) // NOT STUBBING
    sum_stub.withArgs(1, 1).returns(2) // NOT STUBBING

    const result = sumMore1(1)
    assert.strictEqual(result, 2)
  });
});

【问题讨论】:

    标签: node.js mocha.js sinon es6-modules stub


    【解决方案1】:

    我在互联网上的任何地方都没有找到这个解决方案,我找到了一些适用于带有请求或 babilon 的节点的解决方案,但不适用于我使用 ES 模块的情况:

    所以我想注册解决方案以防万一有人需要。


    为了解决这个问题,创建一个新文件,它可以分配在项目的任何地方,在这种情况下我将它命名为 sumImport.js:

    内部文件:sumImport.js

    import sum from 'externalSum';
    
    // export as object
    export default {
      sum
    }
    

    对象需要在我要测试的创建函数内部调用,并改变了导入方式:

    内部文件:mathProblems.js

    import sumObj from './sumImport.js';
    
    export function sumMore1(a) {
      const { sum } = sumObj;
      return sum(a, 1);
    }
    

    我终于设法在测试中导入为对象:

    内部文件:spec.js

    import sinon from 'sinon'
    import assert from 'assert'
    import sumObj from '../sumImport.js'
    import { sumMore1 } from '../mathProblems.js'
    
    describe('sumMore1 is working', () => {
      it('sumMore1 test', () => {
        const sum_stub = sinon.stub(sumObj, "sum") // STUBBED
        sum_stub.withArgs(1, 1).returns(2) // STUBBED
    
        const result = sumMore1(1)
        assert.strictEqual(result, 2)
      });
    });
    

    我希望它可以帮助某人,如果其他人有更好的解决方案,我也将不胜感激!

    【讨论】:

      猜你喜欢
      • 2017-06-28
      • 2016-06-19
      • 2021-01-24
      • 2014-02-21
      • 2017-03-22
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 2018-08-29
      相关资源
      最近更新 更多