在使用 sinon
和 mocha
进行单元测试时,模拟 npm
模块是一个常见的需求。以下是如何使用这两个工具来模拟 npm
模块的详细步骤和示例代码。
npm
模块的行为。假设我们有一个模块 myModule.js
,它依赖于一个外部 npm
模块 externalModule
:
// myModule.js
const externalModule = require('externalModule');
exports.myFunction = async () => {
const result = await externalModule.someAsyncFunction();
return result;
};
我们可以使用 sinon
和 mocha
来模拟 externalModule
:
// test/myModule.test.js
const sinon = require('sinon');
const { expect } = require('chai');
const myModule = require('../myModule');
const externalModule = require('externalModule');
describe('myModule', () => {
let sandbox;
beforeEach(() => {
sandbox = sinon.createSandbox();
});
afterEach(() => {
sandbox.restore();
});
it('should call externalModule.someAsyncFunction and return its result', async () => {
// 创建一个模拟的 Promise 返回值
const mockResult = { data: 'mocked data' };
const stub = sandbox.stub(externalModule, 'someAsyncFunction').resolves(mockResult);
const result = await myModule.myFunction();
expect(result).to.deep.equal(mockResult);
expect(stub.calledOnce).to.be.true;
});
it('should handle error from externalModule.someAsyncFunction', async () => {
const errorMessage = 'mocked error';
const stub = sandbox.stub(externalModule, 'someAsyncFunction').rejects(new Error(errorMessage));
try {
await myModule.myFunction();
} catch (error) {
expect(error.message).to.equal(errorMessage);
expect(stub.calledOnce).to.be.true;
}
});
});
sinon.createSandbox()
创建一个沙盒,以便在每个测试用例前后清理模拟对象。sandbox.stub()
创建一个存根,替代 externalModule.someAsyncFunction
。.resolves()
或 .rejects()
定义存根的行为,模拟异步函数的返回值或错误。expect(stub.calledOnce).to.be.true
验证存根是否被正确调用。externalModule
已正确安装在 node_modules
目录中。通过这种方式,你可以有效地模拟 npm
模块,提高单元测试的可靠性和效率。
领取专属 10元无门槛券
手把手带您无忧上云