問題描述
是否可以從 env 文件加載環境變量以在 Jest 中進行單元測試?我希望像這樣對其進行一系列測試:
Is it possible to load environment variables from an env file for unit testing purposes in Jest? I'm looking to run a series of tests on it like so:
// unit tests for env file
describe('env', () => {
it('should have a client id', () => {
expect(process.env.CLIENT_ID).toBeDefined();
});
it('should have a client secret', () => {
expect(process.env.CLIENT_SECRET).toBeDefined();
});
it('should have a host', () => {
expect(process.env.HOST).toBeDefined();
});
it('should have a scope', () => {
expect(process.env.SCOPE).toBeDefined();
});
it('should have a response type', () => {
expect(process.env.RESPONSE_TYPE).toBeDefined();
});
it('should have a redirect uri', () => {
expect(process.env.REDIRECT_URI).toBeDefined();
});
});
目前,上述所有測試都將失敗,說明變量未定義.最初我使用的是 mocha/chai 設置,它允許我通過使用 dotenv 加載我的所有 env 變量.這涉及通過 webpack 運行所有單元測試并且工作正常.
Currently, all the above tests will fail, stating that the variables are undefined. Initially I was using a mocha/chai setup, which allowed me to just load all of my env variables via the use of dotenv. This involved running all unit tests through webpack and worked fine.
但是,通過閱讀 文檔 Jest 不會運行測試通過 webpack;相反,模塊是通過 moduleNameMapper 模擬出來的.這適用于其他一切,但我無法加載 env 文件變量.到目前為止,我已經嘗試將 setupFiles 選項用于調用 dotenv.config 的 js 文件,并使用給它的 env 文件的路徑,如下所示:
However, from reading the documentation Jest doesn't run tests through webpack; instead modules are mocked out via moduleNameMapper. This works fine for everything else, but I can't get the env file variables to load. So far I've tried using the setupFiles option to a js file that calls dotenv.config with the path of the env file given to it like so:
// setup file for jest
const dotenv = require('dotenv');
dotenv.config({ path: './env' });
這不起作用,所以我現在只使用一個 .env.js 文件進行單元測試,并將這個文件傳遞給 setupFiles 選項.但是,為了可維護性,并使其與 webpack 一起用于生產,我想將它們全部保存在一個文件中.以下是 .env.js 文件如何查找以供參考的摘錄
This didn't work, so I've now resorted to using just a .env.js file for unit tests and passing this file into the setupFiles option instead. However, for maintainability, and to keep it working with webpack for production, I'd like to just keep it all in one file. Here's an extract of how the .env.js file looks for reference
// .env.js extract example
process.env.PORT = 3000;
process.env.HOST = 'localhost';
process.env.CLIENT_ID = 'your client id';
process.env.REDIRECT_URI = 'your callback endpoint';
推薦答案
您使用 ./
的頂級配置路徑從注入點來看是相對的,您的測試套件可能位于名為test
導致在運行單元測試時找不到它.dotenv.config();
使用類似于絕對路徑的全局注入策略.
Your top config path using ./
is relative from the point of injection, it's likely your test suite might be inside a folder named test
which causes it to not be found when running your unit tests. dotenv.config();
Uses global injection strategy which is similar to absolute pathing.
這篇關于使用 .env 文件進行單元測試的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!