Search code examples
node.jschild-process

How to test an node file, receiving an 'EACCES' error when spawning the function


When creating a CLI I would like to test my function. For that I'm using the module child_process.

const path = require('path');
const { execFile } = require('child_process');

describe('cli test', () => {
  test('thing', () => {

    const myCli = execFile(
      `${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
      (err, stdout, stderr) => {
      if (err) {
        console.log('err: ', err);
      }
    });
});

But this produces the following error:

Attempted to log "err:  { Error: spawn /projects/cli/src/cli.js EACCES
        at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
        at onErrorNT (internal/child_process.js:415:16)
        at process._tickCallback (internal/process/next_tick.js:63:19)
      errno: 'EACCES',
      code: 'EACCES',

Running this script directly in the terminal via the command: $ node cli.js --foo Bar works perfectly.

Now a suggestion is to chmod +x <file> that file (source). But the test should also work on CI, and on a different computer which pulls the Git repo.

Any idea?


Solution

  • I'd suggest using fork instead of execFile.

    The child_process.fork() method is a special case of child_process.spawn() used specifically to spawn new Node.js processes.

    This will allow you to execute JS files without needing them to be shell executable.