reactjs - تست برنامه React با Jest با کتابخانه envalid خطا میدهد: process.exit با مقدار "1" فراخوانی شد
من دارم تلاش میکنم برنامه React/Typescript خودم را با Jest تست کنم و این خطا را دریافت میکنم. من از کتابخانه envalid استفاده میکنم تا متغیرهای محیطی من دارای تایپ و تکمیل خودکار باشند:
const ENV = cleanEnv(process.env, {
| ^
6 | REACT_SOME_VALUE: str({ default: 'someValue' }),
at defaultReporter (node_modules/envalid/src/reporter.ts:62:3)
at Object.getSanitizedEnv (node_modules/envalid/src/core.ts:100:3)
at cleanEnv (node_modules/envalid/src/envalid.ts:18:19)
at Object.<anonymous> (src/common/environment.ts:4:13)
process.exit called with "1"
کدی که در آن محیطها را تعریف میکنم:
import { cleanEnv, str } from 'envalid';
const ENV = cleanEnv(process.env, {
REACT_SOME_VALUE: str({ default: 'someValue' }),
REACT_APP_OTHER_VALUE1: str(),
REACT_APP_OTHER_VALUE2: str(),
});
export default ENV;
تستی که در آن شکست میخورم یک تست رندر ساده برای کامپوننت App من است:
App.test.tsx
import { render } from '@testing-library/react';
import { act } from 'react-dom/test-utils';
import App from './app';
describe('App tests', () => {
it('Should render without errors', async () => {
await act(async () => {
render(<App />);
});
});
});
*توجه
این کد در زمان اجرا کار میکند و هنگام کامپایل خطا نمیدهد، اما وقتی تست Jest را اجرا میکنم، خطا میدهد.
پاسخ شماره ۱
راه حل این موضوع، بدون تاثیر بر اعتبارسنجی متغیرهای محیطی در محیط تولید، استفاده از ویژگی devDefault همراه با تابع testOnly است.
به عنوان مثال:
import { cleanEnv, str, testOnly } from 'envalid';
const ENV = cleanEnv(process.env, {
REACT_SOME_VALUE: str({ devDefault: testOnly('someValue') }),
REACT_APP_OTHER_VALUE1: str({ devDefault: testOnly('') }),
REACT_APP_OTHER_VALUE2: str({ devDefault: testOnly('') }),
});
export default ENV;
شما میتوانید این را در مستندات envalid پیدا کنید.
پاسخ شماره ۲
مشکل این است که برخی یا تمام متغیرهای محیطی مورد نیاز شما در محیط Jest شما تعریف نشدهاند. این موضوع گیجکننده است زیرا Jest پیام خطای زیبایی که معمولاً envalid نشان میدهد را پنهان میکند و همه آنچه شما دریافت میکنید عبارت رمزآلود process.exit با مقدار "1" فراخوانی شد است.
شما میتوانید یک .env.test یا مشابه آن تعریف کنید، اما باید بهطور صریح آن را بارگذاری کنید، یا در فایل تست خود یا - بهتر - در یک فایل تنظیمات جهانی:
const dotenv = require("dotenv");
dotenv.config({ path: `${__dirname}/.env.test` });
