如何在JavaScript中存根库函数

如何在JavaScript中存根库函数,javascript,node.js,testing,mocha.js,sinon,Javascript,Node.js,Testing,Mocha.js,Sinon,例如,如果我在src/lib/a.js中定义了main.js调用a,并且函数a调用node uuid.v1,那么在测试main.js时,我如何存根node uuid.v1 main.js const a = require("./src/lib/a").a const main = () => { return a() } module.exports = main const generateUUID = require("node-uuid").v1 const a = (

例如,如果我在src/lib/a.js中定义了main.js调用a,并且函数a调用node uuid.v1,那么在测试main.js时,我如何存根node uuid.v1

main.js

const a = require("./src/lib/a").a

const main = () => {
  return a()
}

module.exports = main
const generateUUID = require("node-uuid").v1

const a = () => {
  let temp = generateUUID()
  return temp
}

module.exports = {
  a
}
const assert = require("assert")
const main = require("../main")
const sinon = require("sinon")
const uuid = require("node-uuid")

describe('main', () => {
  it('should return a newly generated uuid', () => {
    sinon.stub(uuid, "v1").returns("121321")

    assert.equal(main(), "121321")
  })
})
src/lib/a.js

const a = require("./src/lib/a").a

const main = () => {
  return a()
}

module.exports = main
const generateUUID = require("node-uuid").v1

const a = () => {
  let temp = generateUUID()
  return temp
}

module.exports = {
  a
}
const assert = require("assert")
const main = require("../main")
const sinon = require("sinon")
const uuid = require("node-uuid")

describe('main', () => {
  it('should return a newly generated uuid', () => {
    sinon.stub(uuid, "v1").returns("121321")

    assert.equal(main(), "121321")
  })
})
测试/main test.js

const a = require("./src/lib/a").a

const main = () => {
  return a()
}

module.exports = main
const generateUUID = require("node-uuid").v1

const a = () => {
  let temp = generateUUID()
  return temp
}

module.exports = {
  a
}
const assert = require("assert")
const main = require("../main")
const sinon = require("sinon")
const uuid = require("node-uuid")

describe('main', () => {
  it('should return a newly generated uuid', () => {
    sinon.stub(uuid, "v1").returns("121321")

    assert.equal(main(), "121321")
  })
})
由于上述测试失败,
sinon.stub(…)
语句没有为src/lib/a.js存根uuid.v1


是否有一种全局调用库函数的方法,以便它在被调用时执行指定的行为?

在导入主模块之前,您应该配置存根。这样,模块将调用存根而不是原始函数

const assert = require("assert")
const sinon = require("sinon")
const uuid = require("node-uuid")

describe('main', () => {
  it('should return a newly generated uuid', () => {
    sinon.stub(uuid, "v1").returns("121321")
    const main = require("../main")

    assert.equal(main(), "121321")
  })
})

请记住,节点uuid已被弃用,正如您在本警告中看到的那样

[不推荐使用警告:不推荐使用require('uuid'),并且 此模块的3.x版之后将不受支持。请改用 要求('uuid/[v1 | v3 | v4 | v5]'),如下例所示。]

关于如何将其存根以进行测试将比以前更加困难,因为实际上没有一种简单的方法可以使用sinon模拟独立函数

创建自定义模块

//custom uuid
module.exports.v1 = require('uuid/v1');
需要项目中自定义模块的uuid

const uuid = require('<path_to_custom_module>');

Sinon.stub(uuid, 'v1').returns('12345');
const uuid=require(“”);
Sinon.stub(uuid,'v1')。返回('12345');

如果为了编写合理的测试,您必须存根一些代码,我建议您只存根直接依赖项。其他任何东西都会过度增加耦合。