从另一个文件调用的 Sinon 存根方法
Sinon stub method calling from another file
我正在尝试在我的项目中设置单元测试。为此,我使用 mocha chai 和 sinon 图书馆。我使用的是 NodeJs 服务器版本 8。
版本:
诗乃:“7.1.0”
摩卡:“5.1.0”
柴:“4.2.0”
我想存根一个在另一个文件中声明的方法。
这是一个例子:
- a.js
exports.FnA(return FnB())
- b.js
exports.FnB()
我想从 b.js 文件存根方法 FnB() 以便我可以测试 FnA() 而不管 FnB() return。
这是我尝试过的方法:
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
它确实存根方法 FnB() 但仅当我从 b 文件的实例调用它时。所以当我调用 FnA() 时,存根似乎消失了......
我错过了什么?
非常感谢您的帮助,谢谢 :)
编辑:
a.js 示例:
const FnB = require('./FnB)
exports.FnA = data => {
const limit = data.releases.update ? 60 : 20;
return FnB(data.ref, limit)
};
b.js 示例:
exports.FnB = (ref, page, query) => {
//API call
}
testFile.js 示例:
const a = require('../a')
const b = require('../b')
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
正如我所说,我想对这个 FnB 调用方法进行存根,然后检查是否使用正确的参数调用了这个方法。
如果被导出的模块本身是函数而不是对象的一部分,则不能直接存根。
您需要使用 proxyquire 之类的东西。您的测试代码将如下所示:
const FnBstub = sinon.stub();
const proxyquire = require('proxyquire');
const a = proxyquire('../a', {
FnB: FnBstub
});
const b = require('../b');
有关详细信息,请查看此处:https://github.com/sinonjs/sinon/issues/664
我正在尝试在我的项目中设置单元测试。为此,我使用 mocha chai 和 sinon 图书馆。我使用的是 NodeJs 服务器版本 8。
版本:
诗乃:“7.1.0” 摩卡:“5.1.0” 柴:“4.2.0”
我想存根一个在另一个文件中声明的方法。
这是一个例子:
- a.js
exports.FnA(return FnB())
- b.js
exports.FnB()
我想从 b.js 文件存根方法 FnB() 以便我可以测试 FnA() 而不管 FnB() return。
这是我尝试过的方法:
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
它确实存根方法 FnB() 但仅当我从 b 文件的实例调用它时。所以当我调用 FnA() 时,存根似乎消失了......
我错过了什么?
非常感谢您的帮助,谢谢 :)
编辑:
a.js 示例:
const FnB = require('./FnB)
exports.FnA = data => {
const limit = data.releases.update ? 60 : 20;
return FnB(data.ref, limit)
};
b.js 示例:
exports.FnB = (ref, page, query) => {
//API call
}
testFile.js 示例:
const a = require('../a')
const b = require('../b')
beforeEach(() => {
this.FnBStub = sinon.stub(b, 'FnB').returns('mocked');
});
afterEach(() => this.FnBStub.restore());
it('should mocked FnB function', () => {
try {
console.log(b.FnB()); //returns 'mocked'
console.log(a.FnA()); //return error from FnB() execution ...
} catch (e) {
console.log(e);
}
});
正如我所说,我想对这个 FnB 调用方法进行存根,然后检查是否使用正确的参数调用了这个方法。
如果被导出的模块本身是函数而不是对象的一部分,则不能直接存根。
您需要使用 proxyquire 之类的东西。您的测试代码将如下所示:
const FnBstub = sinon.stub();
const proxyquire = require('proxyquire');
const a = proxyquire('../a', {
FnB: FnBstub
});
const b = require('../b');
有关详细信息,请查看此处:https://github.com/sinonjs/sinon/issues/664