如何在 NodeJS 中模拟嵌套依赖关系

jbs*_*s87 2 testing unit-testing node.js sinon proxyquire

我有一个模块a

const b = require(./b);

function aGetResult() {
  return b.getInfo();
}
Run Code Online (Sandbox Code Playgroud)

模块B

const c = require(./c);
    
function getInfo() {
  return getDetailInfo();
}

function getDetailInfo() {
    const result = c.getApiResult();
    return result
}
Run Code Online (Sandbox Code Playgroud)

模块C

function getApiResult() {
  return api.get(/test/1);
}
Run Code Online (Sandbox Code Playgroud)

我已经为模块 A 编写了一个测试,但遇到了存根依赖项的问题。我只想存根c.getApiResult()而不是b.getInfo()or b.getDetailInfo()。我尝试过有选择地使用存根proxyquire,但遇到了问题。有什么帮助吗?

sli*_*wp2 5

您应该使用全局覆盖包的要求proxyquire

\n

a取决于bb取决于c。现在,您想在测试时模拟间接c 依赖而不是直接依赖。不建议这样做。但无论如何,解决方案如下:ba

\n

例如

\n

a.js:

\n
const b = require(\'./b\');\n\nfunction aGetResult() {\n  return b.getInfo();\n}\n\nexports.aGetResult = aGetResult;\n
Run Code Online (Sandbox Code Playgroud)\n

b.js:

\n
const c = require(\'./c\');\n\nfunction getInfo() {\n  return getDetailInfo();\n}\n\nfunction getDetailInfo() {\n  const result = c.getApiResult();\n  return result;\n}\n\nmodule.exports = { getInfo };\n
Run Code Online (Sandbox Code Playgroud)\n

c.js:

\n
const api = {\n  get(url) {\n    return \'real result\';\n  },\n};\n\nfunction getApiResult() {\n  return api.get(\'/test/1\');\n}\n\nmodule.exports = { getApiResult };\n
Run Code Online (Sandbox Code Playgroud)\n

a.test.js:

\n
const proxyquire = require(\'proxyquire\');\nconst { expect } = require(\'chai\');\nconst sinon = require(\'sinon\');\n\ndescribe(\'63275147\', () => {\n  it(\'should pass\', () => {\n    const stubs = {\n      \'./c\': {\n        getApiResult: sinon.stub().returns(\'stubbed result\'),\n        \'@global\': true,\n      },\n    };\n    const a = proxyquire(\'./a\', stubs);\n    const actual = a.aGetResult();\n    expect(actual).to.be.eq(\'stubbed result\');\n    sinon.assert.calledOnce(stubs[\'./c\'].getApiResult);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

单元测试结果:

\n
  63275147\n    \xe2\x9c\x93 should pass (2630ms)\n\n\n  1 passing (3s)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |   83.33 |      100 |      60 |   83.33 |                   \n a.js     |     100 |      100 |     100 |     100 |                   \n b.js     |     100 |      100 |     100 |     100 |                   \n c.js     |      50 |      100 |       0 |      50 | 3-8               \n----------|---------|----------|---------|---------|-------------------\n
Run Code Online (Sandbox Code Playgroud)\n