Mastering Jest: 4 Ways to Mock Process.env

In the realm of JavaScript testing, Jest has emerged as a powerful and popular choice for developers. It provides a comprehensive testing framework with an intuitive API, making it a go-to tool for creating robust and reliable tests. However, when it comes to testing applications that interact with the environment, specifically with process.env, developers often encounter challenges. Process.env is an object in Node.js that contains environment variables, which can vary depending on the deployment environment, making it crucial to handle them effectively during testing.
In this comprehensive guide, we will delve into the art of mocking process.env using Jest, exploring four distinct approaches. By the end, you'll possess the knowledge and skills to navigate the complexities of testing environment-sensitive applications with confidence.
1. The Jest Mock Function

The Jest mock function is a versatile tool that allows you to create mock implementations for any function, including process.env. This method is particularly useful when you need to simulate specific values for environment variables during your tests. Here's a step-by-step guide to using the Jest mock function to mock process.env:
Step 1: Import Jest's Mock Function
First, you'll need to import the jest.mock
function into your test file. This function allows you to create mock implementations for specific functions or modules.
import { mock } from 'jest-mock';
Step 2: Create a Mock Implementation of process.env
Next, you'll create a mock implementation of process.env using the jest.mock
function. This mock implementation will replace the actual process.env object during your tests, allowing you to define the values you want to test against.
const mockedProcessEnv = mock();
mockedProcessEnv.__esModule = true;
mockedProcessEnv.default = {
NODE_ENV: 'test',
API_KEY: 'mock-api-key',
};
In this example, we've defined two environment variables: NODE_ENV
and API_KEY
. The NODE_ENV
variable is set to 'test'
, indicating that we're in a testing environment. The API_KEY
variable is set to 'mock-api-key'
, which can be any value you want to use for testing purposes.
Step 3: Use the Mocked process.env in Your Tests
With your mock implementation of process.env in place, you can now use it in your tests. Here's an example of how you might write a test that relies on the mocked process.env values:
import { myFunction } from './my-module';
describe('My Function', () => {
it('should return the correct API key when NODE_ENV is "test"', () => {
const result = myFunction();
expect(result).toBe('mock-api-key');
});
In this test, we're calling myFunction
, which presumably retrieves the API key based on the NODE_ENV
value. Since we've mocked process.env with NODE_ENV: 'test'
, the function should return 'mock-api-key'
, which we then assert using Jest's expect
function.
2. The Jest Module Mocker

The Jest module mocker is another powerful tool for mocking process.env. It allows you to define custom mock implementations for specific modules, making it ideal for mocking process.env and other environment-related modules. Here's how you can use the Jest module mocker to mock process.env:
Step 1: Define a Custom Mock for process.env
First, you'll need to create a custom mock for process.env in your test setup file. This file is typically named jest.setup.js
or jest.config.js
, and it's where you can configure your Jest environment.
jest.mock('process', () => {
const process = jest.requireActual('process');
process.env = {
NODE_ENV: 'test',
API_KEY: 'mock-api-key',
};
return process;
});
In this example, we're mocking the process
module and replacing its process.env object with our custom mock. We've defined two environment variables: NODE_ENV
and API_KEY
, just like in the previous example.
Step 2: Use the Mocked process.env in Your Tests
With the custom mock for process.env in place, you can now write your tests as usual. The mocked process.env values will be automatically used in your tests without any additional setup.
import { myFunction } from './my-module';
describe('My Function', () => {
it('should return the correct API key when NODE_ENV is "test"', () => {
const result = myFunction();
expect(result).toBe('mock-api-key');
});
In this test, we're calling myFunction
just like before, and since we've mocked process.env with NODE_ENV: 'test'
, the function should return 'mock-api-key'
, which we then assert using Jest's expect
function.
3. The Jest.resetModules() Function
The Jest.resetModules() function is a handy tool for resetting the state of your modules, including process.env, between tests. This is especially useful when you have tests that rely on different environment variable values and you want to ensure a clean slate for each test.
Step 1: Use Jest.resetModules() in Your Test Setup
To use Jest.resetModules()
, you'll typically place it in your test setup file, such as jest.setup.js
or jest.config.js
. This function resets the state of all modules, including process.env, to their initial values.
jest.resetModules();
Step 2: Define Mocked process.env Values in Each Test
With Jest.resetModules()
in place, you can now define the mock values for process.env within each individual test. This allows you to have different environment variable values for each test, ensuring that they run in isolation.
import { myFunction } from './my-module';
describe('My Function', () => {
it('should return the correct API key when NODE_ENV is "test"', () => {
process.env.NODE_ENV = 'test';
process.env.API_KEY = 'mock-api-key';
const result = myFunction();
expect(result).toBe('mock-api-key');
});
In this example, we've defined the NODE_ENV
and API_KEY
environment variables within the test itself. This ensures that each test runs with its own set of environment variable values, allowing for precise and isolated testing.
Jest.resetModules()
is a great way to ensure that your tests are truly independent of each other and that they always start with a clean slate. It's particularly useful when you have a large suite of tests with varying environment requirements.
4. The Jest.setMock() Function
The Jest.setMock() function provides a way to set custom mock implementations for specific modules, including process.env. This function is similar to the Jest module mocker, but it allows you to set mocks for individual modules without needing to mock the entire process
module.
Step 1: Use Jest.setMock() to Mock process.env
To use Jest.setMock()
, you'll typically place it in your test setup file. Here's an example of how you can use it to mock process.env:
jest.setMock('process', {
env: {
NODE_ENV: 'test',
API_KEY: 'mock-api-key',
},
});
In this example, we're setting a custom mock for the process.env object. We've defined two environment variables: NODE_ENV
and API_KEY
, just like in the previous examples.
Step 2: Use the Mocked process.env in Your Tests
With the custom mock for process.env in place, you can now write your tests as usual. The mocked process.env values will be automatically used in your tests without any additional setup.
import { myFunction } from './my-module';
describe('My Function', () => {
it('should return the correct API key when NODE_ENV is "test"', () => {
const result = myFunction();
expect(result).toBe('mock-api-key');
});
In this test, we're calling myFunction
just like before, and since we've mocked process.env with NODE_ENV: 'test'
, the function should return 'mock-api-key'
, which we then assert using Jest's expect
function.
Jest.setMock()
is a more targeted approach to mocking specific modules. It's useful when you want to mock a single module without affecting other parts of your application's environment.
Conclusion

In this comprehensive guide, we've explored four effective ways to mock process.env using Jest. Whether you prefer the flexibility of the Jest mock function, the customizability of the Jest module mocker, the isolation provided by Jest.resetModules()
, or the targeted mocking of Jest.setMock()
, you now have the tools to tackle testing environment-sensitive applications with confidence.
By mastering these techniques, you can ensure that your tests accurately simulate different environment scenarios, leading to more robust and reliable code. Jest's powerful mocking capabilities make it a valuable tool in your testing arsenal, helping you deliver high-quality applications with confidence.
FAQ
How can I handle sensitive environment variables during testing without exposing them in the codebase?
+One approach is to use a tool like dotenv
to load environment variables from a .env
file during development and testing. This way, you can keep sensitive variables out of your codebase and version control. During testing, you can create mock .env
files with different values to simulate various environments.
Can I use these mocking techniques with other Node.js modules that rely on process.env, such as the fs module?
+Absolutely! The same mocking techniques can be applied to other Node.js modules that rely on process.env. For example, if you’re testing a module that uses the fs
module to read configuration files based on process.env variables, you can mock process.env to simulate different configurations.
Are there any performance considerations when using these mocking techniques in large test suites?
+While these mocking techniques are powerful, they can introduce some overhead, especially in large test suites. If performance becomes a concern, you might consider using more targeted mocking approaches, such as Jest.setMock()
, to minimize the impact on your test suite’s performance.