Test-only utilities


#1

Hi,

I would like to specify some utility code for my tests as functions that can only run in test mode (when meteor.isTest is true).
However I would like to avoid to have to put an if (Meteor.isTest) on every function.
I would rather, similarly to what is possible with isClient and isServer, have a folder path that would prevent the code to be loaded/executed if meteor is not in test mode.
Client and server have the “client” and 'server" folder convetions.

Basically I would like the same for testing code so that it only can get executed during test mode.

Meteor does provide a “tests” special folder path, however that one basically prevents loading completely as it is meant to be used for external (outside of meteor) tests.

So is there a way to achieve what I want without having to manually specifiy Meteor.isTest everywhere?

Thanks!


#2

If your code is in a package, you can add an onTest to the package file to indicate files you would like to load during a test:

Package.describe({
  name: 'your:package',
  version: '0.0.1',
  summary: '...',
  git: '...',
  documentation: 'README.md',
});

var dependencies = [
  'ecmascript',
  'underscore',
];

Package.onUse(function(api) {
  api.versionsFrom('METEOR@1.4');
  api.use(dependencies, ['client', 'server']);
  api.mainModule('client/main.js', 'client');
  api.mainModule('server/main.js', 'server');
});

Package.onTest(function(api) {
  api.versionsFrom('METEOR@1.4');

  api.use(dependencies);
  api.use([
    'tinytest',
    'practicalmeteor:sinon', // or your test library of choice
    'your:package', // don't forget to depend on your package under test here
  ]);

  api.mainModule('client/test.js', 'client');
  api.mainModule('server/test.js', 'server');
});

Here, during a test, the entry points will be client/test.js and server/test.js on the client and server, respectively. You can import test-only files in each of them.

If you’re using Meteor 1.7, you can also take advantage of the new testModule option in package.json mentioned in the release notes here: https://docs.meteor.com/changelog.html#v1720180528