问题
I am trying to stub a sails controller function, but I don't know which object to stub.
using
sinon.stub(object,'funcname', function()...
This is probably related to the way sails bind controller functions...
Here is some code to give example
Controller file api/controllers/PersonController.js
var fs = require('fs');
//
// I want to stub retrieveData function when testing
//
function retreiveData(cb) {
fs.readFile('./filedata', function (err, data) {
if (err) throw err;
cb(data.toString());
});
};
function showdata(req, res) {
var stack = new Error().stack
console.log( stack )
retreiveData(function (data) {
res.send(data);
});
};
module.exports = {
showdata: showdata,
retreiveData: retreiveData
};
Test file:
var request = require('supertest');
var sinon = require('sinon');
describe('GET /person/showdata', function() {
it('should return person show data', function(done) {
//
// here is the stub function I want to create
//
stub = sinon.stub(sails.middleware.controllers.person, 'retreivedata', function(cb) {
cb("Some stub data");
});
request(server)
.get('/person/showdata')
.expect(200)
.expect(/Some stub data/)
.end(function(err, res) {
if (err)
throw err;
done();
});
});
});
bootstrap file: test/bootstarp.test.js
var Sails = require('sails'), sails;
var _ = require('lodash');
before(function(done) {
Sails.lift({
// configuration for testing purposes
}, function(err, s) {
if (err) return done(err);
sails = s;
global.server = sails.hooks.http.app;
// here you can load fixtures, etc.
done(err, sails);
});
});
after(function(done) {
// here you can clear fixtures, etc.
sails.lower(done);
});
I am running test with:
NODE_ENV=test mocha test/bootstrap.test.js test/api/**/*.js
and get :
TypeError: Attempted to wrap object property retreivedata as function
回答1:
Here is a possible solution.
Controller call the function from a ctrlFunc object
var ctrlFunc = { retreiveData: retreiveData, }; function showdata(req, res) { ctrlFunc.retreiveData(function (data) { res.send(data); }); };
Controller need to export ctrlFunc object during test (sinon.stub need access to ctrlFunc)
/* Only add extra exports during test this allow sinon.stub to retreive object during test */ if (process.env.NODE_ENV === 'test') { module.exports.ctrlFunc = ctrlFunc; }
test file require PersonController, then stub method on PersonController.ctrlFunc object
var PersonCtrl = require('../../../api/controllers/PersonController'); stub = sinon.stub(PersonCtrl.ctrlFunc, 'retreiveData', function(cb) { console.log('into stub function'); cb("Some stub data"); });
placing all together we have now:
controller file
// File: api/controllers/PersonController.js var fs = require('fs'); var ctrlFunc = { retreiveData: retreiveData, }; function retreiveData (cb) { fs.readFile('./filedata', function (err, data) { if (err) throw err; cb(data.toString()); }); }; function showdata(req, res) { ctrlFunc.retreiveData(function (data) { res.send(data); }); }; module.exports = { showdata: showdata, }; /* Only add extra exports during test this allow sinon.stub to retreive object during test */ if (process.env.NODE_ENV === 'test') { module.exports.ctrlFunc = ctrlFunc; }
test file:
// test/api/controllers/PersonController.test.js var request = require('supertest'); var sinon = require('sinon'); describe('GET /person/showdata', function() { var stub; before(function() { var PersonCtrl = require('../../../api/controllers/PersonController'); stub = sinon.stub(PersonCtrl.ctrlFunc, 'retreiveData', function(cb) { console.log('into stub function'); cb("Some stub data"); }); }); after(function() { stub.restore(); }); it('should return person show data', function(done) { request(server) .get('/person/showdata') .expect(200) .expect(/Some stub data/) .end(function(err, res) { if (err) throw err; done(); }); }); });
test is now successfull
NODE_ENV=test mocha test/bootstrap.test.js test/api/controllers/PersonController.test.js GET /person/showdata into stub function ✓ should return person show data (62ms) 1 passing (2s)
来源:https://stackoverflow.com/questions/34109254/sails-js-mocha-supertest-sinon-how-to-stub-sails-js-controller-function