sails-hook-rewire
This is a installable sailsjs hook that lets you rewire sails components, when sails is
lifted in test
environment.
Often during testing you need to stub certain functions inside your sails models/controllers/services,
for example a function that makes http calls.
sails-hook-rewire
uses the rewire
module to replace components already
loaded by sails, with their rewired versions.
Installation
npm install sails-hook-rewire --save
Usage
List components you want rewired, in config/rewire.js
module.exports.rewire = {
services: [
{
name: 'FileService',
global: true
},
{
name: 'FetchService',
global: false
}
],
controllers: [
{
name: 'FileController'
},
{
name: 'DNSLookUpController',
global: true
}
]
};
Rewire your components
Suppose you have a service, FileService, that depends on the fs
module, and you want to stub fs.readFile
method
in the service. Since the service has already been rewired, all you need to do is stub
var expect = require('expect.js'),
fileServiceRevert;
describe('Tests for FileService', function () {
before(function () {
fileServiceRevert = FileService.__set__({
fs: {
readFile: function (filename, options, callback) {
var response = {
err: null,
data: undefined
};
callback = typeof options === 'function' && options || callback || function () {};
filename.match(/error/) && (response.err = new Error('Error reading file'));
filename.match(/.+\/valid/) && (response.data = '{"valid": true}');
filename.match(/.+\/invalid/) && (response.data = '{"invalid": true;');
return callback(response.err, response.data);
}
}
});
});
after(function () {
fileServiceRevert();
});
it('handles read error', function (done) {
FileService.fetchJSONFromFile('/var/www/jsons/error.json', function (err, data) {
expect(err).to.be.ok();
expect(err.error instanceof Error).to.be.ok();
expect(data).to.not.be.ok()
return done();
});
});
it('handles invalid json', function (done) {
FileService.fetchJSONFromFile('/var/www/jsons/invalid.json', function (err, data) {
expect(err).to.be.ok();
expect(err.error instanceof Error).to.be.ok();
expect(data).to.not.be.ok()
return done();
});
});
it('returns a json if file has valid json', function (done) {
FileService.fetchJSONFromFile('/var/www/jsons/valid.json', function (err, data) {
expect(err).to.not.be.ok();
expect(data).to.be.ok();
expect(data).to.be.an('object');
expect(data.valid).to.be.ok();
return done();
});
});
});
Run tests
When running tests, ensure that sails is lifted in the test
environment. You can do this by either,
- Setting
NODE_ENV
to test
before the tests are run
export NODE_ENV=test;
npm test;
unset NODE_ENV;
- Passing the environment to sails while loading in a test bootstrap.
var Sails = require('sails'),
sails;
before(function (done) {
Sails.load({
environment: 'test'
},
function (err, server) {
if (err) { return done(sails); }
sails = server;
return done(null, sails);
});
});
after(function (done) {
sails.lower(done);
});
Optionally, if you wish to lift your server in test mode, you can pass the environment as an option to sails lift
sails lift --environment=test
####### Changing name of environment
If you run your tests with another environment variable name, you can specity it in the configuration:
module.exports.rewire = {
environments: {
test: true,
shippable: true,
development: false
}
For more examples of how to test sails components with rewire, check out the
tests for this module.
This project is licensed under the Apache 2.0 License.
For contributing, please check the contributing guidelines.
Made with :heart: by Postman