node.js - nodejs/mocha/chai as promise:预期异步函数中使用的变量在外部初始化
问题描述
我是 mocha/chai 的新手,我花了 2 天时间试图解决以下问题,但没有成功(请注意,下面的代码只是为了展示这个概念,它不是真正的代码)。
我有一个名为“api.js”的 JS 文件,其中通过 dotenv 框架在文件顶部初始化了一些变量,例如 SERVER_URL。
api.js:
const SERVER_URL = process.env.SERVER_URL;
async function startAPI () {
return new Promise ( (resolve, reject) => {
console.log(`${SERVER_URL}`);
resolve();
});
exports = {startAPI};
现在我得到了“test.js”文件,其中:
测试.js:
require('../api');
it('the test', async () => {
return await expect(api.startAPI()).to.be.fulfilled;
});
问题是 SERVER_URL 在测试期间未定义,我无法修改 api.js(因为我不是所有者),只能修改 test.js。
如何在正确设置 SERVER_URL 变量的情况下运行测试(从 api.js 处理.env.SERVER_URL 值)?
有没有任何重构的解决方案?
如果不是最好的解决方案是什么?
专家,提前感谢您的宝贵帮助
解决方案
最简单的方法是在从 CLI 运行测试时设置这些变量:
例如在 npm 脚本中:
"scripts": {
"test": "SERVER_URL='http://example.com' mocha"
}
或直接从终端:
$ SERVER_URL='http://example.com' npm test
但更好的解决方案是在您的测试中模拟环境变量,几乎不需要重构。并且需要proxyquire
安装。实际上async/await
这里不需要。
const proxyquire = require('proxyquire').noPreserveCache() // noPreserveCache is important to always have refreshed script with new process.env.SERVER_URL in each test
const MOCKED_SERVER_URL = 'http://example.com'
describe('example', () => {
let initialServerUrl
let api
beforeEach(() => {
initialServerUrl= process.env
})
afterEach(() => {
process.env = initialServerUrl
})
it('fulfilled', () => {
process.env.USE_OTHER_CODE_PATH = MOCKED_SERVER_URL
api = proxyquire('../api', {})
return expect(api.startAPI()).to.be.fulfilled
})
it('rejected', () => {
process.env.USE_OTHER_CODE_PATH = ''
api = proxyquire('../api', {})
return expect(api.startAPI()).to.be.rejected
})
})
推荐阅读
- python - 如何使用 matplotlib 制作水平虚线?
- typescript - 下一个 JS Mock API 端点在 req.body 中为 POST 发送参数
- javascript - 将输入转换为十六进制和二进制
- reactjs - 钩子 useState 是 formik - React
- android - 取消选择 RecyclerView 单元格,但点击它之外的任何地方
- python - 计算灰度图像的直方图
- javascript - vue js中的vue路由器动态路由与strapi headless CMS - 路由器链接和href标签抛出错误
- python - 在 Palantir Foundry 代码存储库中定义 Pandas UDF 的正确方法是什么
- javascript - PNG图像作为按钮
- vb.net - 在 windowsform 上显示托管在 localhost 中的 WebApp