I have a utility.js which uses program arguments through process.argv.
When I run jest -t 'utility-spec' --arg1 value1 --arg2 value2 it's throwing exception. Failed to run the test.
(node:8956) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): โ Unrecognized CLI Parameters:
Following options were not recognized: ["arg1", "arg2"]
How to pass my program argument.?
Jest doesn't accept node arguments unfortunately. I recommend testing your utility by making a programmatic interface. You can also overwrite process.argv
in your test before requiring your module.
@cpojer Can you please show us a sample how to do that?
@rambabusaravanan
I did this in my spec.js at the top
process.argv.push('--arg1', 'value1');
describe('check', () => {
.....
});
This should not be blocking at all... My Jenkins jobs crash because of that errors, with proxy configuration...
For convenience, and in case Repl.it disappears in the future, here is the code that @SimenB linked to in their comment:
~~~js
process.argv = ['node', 'jest', '--arg1', '1', '--arg2', 'hello']
const argv = require('./argv');
test('argv', () => {
expect(argv).toEqual(['--arg1', '1', '--arg2', 'hello']);
});
~~~
~js
module.exports = process.argv.slice(2);
~
It's worth noting that this also works if you put it in a jest setup file
Jest configuration - jest.config.js
module.exports = {
setupFiles: ['./setup'],
};
Setup File - setup.js
process.argv = ['node', 'jest', 'arg1', 'arg2'];
process.argv.push('--config'); // your flag
process.argv.push('config-local.json'); // flag value
This information might be useful to someone:
I have an npm
task which I run via npm run jest -- --password=MY_PASSWORD
.
The npm
task: "jest": "jest --passWithNoTests --forceExit --silent"
There is a single test file:
test('database', () => {
return new Promise(function(resolve, reject) {
dbConnect(function(err, db) {
if (err) return reject(err);
resolve(db);
});
});
});
dbConnect
internally reads password
from process.argv
to connect to the database. This works, the argument that I pass when running npm
is available in dbConnect
. However, as soon as there are two test files it no longer works because then the arguments get swallowed.
A very bad workaround is running with --maxWorkers=1
. With --maxWorkers=2
the second item in process.argv
is node_modules/jest-worker/build/workers/processChild.js
, otherwise it's node_modules/.bin/jest
. I think if there is only one test file it will also use node_modules/.bin/jest
, so the arguments are passed down.
I was surprised when my tests broke after "not changing anything", not realizing what I did was adding a second test file, which then broke everything. But I didn't see it mentioned anywhere that maxWorkers
has that effect.
I've tried other methods of injecting my custom --password=MY_PASSWORD
argument so it's available in test files but it only works with --maxWorkers=1
or when using only a single test file. :woman_shrugging:
Setup file:
require('babel-plugin-require-context-hook/register')();
require('regenerator-runtime/runtime');
Most helpful comment
@rambabusaravanan
I did this in my spec.js at the top