javascript - 如何使用放置在不同测试套件中单独文件中的 sinon 存根
问题描述
我通过将它们作为单独的文件放在单独的文件夹中来组织存根,例如:
test
|_____ create.test.js
|_____ dochelp.test.js
stubs
|_____ input.js
这是 input.js 存根的代码
const sinon = require('sinon');
const input = require('../../utils/input');
module.exports = sinon.stub(input, 'getInput')
这是 create.test.js 中的代码
const inputStub = require('./stubs/input');
inputStub.resolves(true);
describe('suite', () => {
//... same code is in dochelp.test.js
after(() => {
inputStub.restore();
})
})
由于 require 缓存模块一旦解析,因此每当另一个测试文件需要存根文件时,它将返回缓存模块,因此 create.test.js 文件之前使用的缓存被返回,并且在它完成时返回恢复存根,因此在另一个测试文件中它再次成为正常的非存根函数。
存根如何保存在单独的文件中并在其他测试文件中再次使用。
解决方案
您可以重置模块注册表 - 所需模块的缓存。因此,您可以从 mocha挂钩中的require.cache对象中删除密钥。before
需要时,模块会缓存在此对象中。通过从这个对象中删除一个键值,下一个
require
将重新加载模块。
一个完整的工作示例:
test/create.test.js
:
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const { resetModule } = require('../utils/test');
chai.use(chaiAsPromised);
const { expect } = chai;
describe('create test suite', () => {
let inputStub;
before(() => {
resetModule();
inputStub = require('../stubs/input');
inputStub.resolves(true);
});
after(() => {
inputStub.restore();
});
it('should pass', async () => {
await expect(inputStub()).to.eventually.be.true;
});
});
test/dochelp.test.js
:
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const { resetModule } = require('../utils/test');
chai.use(chaiAsPromised);
const { expect } = chai;
describe('dochelp test suite', () => {
let inputStub;
before(() => {
resetModule();
inputStub = require('../stubs/input');
inputStub.resolves(false);
});
after(() => {
inputStub.restore();
});
it('should pass', async () => {
await expect(inputStub()).to.eventually.be.false;
});
});
utils/input.js
:
const input = {
async getInput() {
return 'real input';
},
};
module.exports = input;
utils/test.js
:
function resetModule() {
delete require.cache[require.resolve('../stubs/input')];
}
module.exports = { resetModule };
stubs/input.js
:
const sinon = require('sinon');
const input = require('../utils/input');
module.exports = sinon.stub(input, 'getInput');
单元测试结果:
⚡ npx mocha ./test/*.test.js
create test suite
✓ should pass
dochelp test suite
✓ should pass
2 passing (469ms)
推荐阅读
- c# - 如何将 Web 服务中使用的 Bitmap 类转换为 C# 应用程序中的 System.Drawing.Bitmap?
- javascript - 如何返回使用 Google Sheets API spreadsheets.values.get 读取的值?
- c++ - C++ 使用 struct 作为某种类型
- python - 虽然我在与我的代码相同的文件夹中打开了文件,但它不会执行
- javascript - 根据 Javascript 中的条件以特定颜色(红色或绿色)在表中显示 JSON 值
- java - 为 Java 设置 PATH 变量的目的
- docker - Windows 上的 RabbitMQ docker 容器持久化
- python - Python For 循环似乎被跳过了
- python - Django:我的 css 静态路径不存在
- usb - 什么是 USB 标准中的功能描述符?