sails.js + mocha + supertest + sinon:如何存储sails.js控制器函数

我试图存根一个帆控制器function,但我不知道哪个对象存根。 使用sinon.stub(object,'funcname', function()...

这可能与风帆绑定控制器function的方式有关…

下面是一些代码来举例

控制器文件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 }; 

testing文件:

 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(); }); }); }); 

引导文件: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); }); 

我正在运行testing:

 NODE_ENV=test mocha test/bootstrap.test.js test/api/**/*.js 

并得到:

 TypeError: Attempted to wrap object property retreivedata as function 

这是一个可能的解决scheme。

  • 控制器从ctrlFunc对象调用函数

     var ctrlFunc = { retreiveData: retreiveData, }; function showdata(req, res) { ctrlFunc.retreiveData(function (data) { res.send(data); }); }; 
  • 控制器在testing期间需要导出ctrlFunc对象(sinon.stub需要访问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; } 
  • testing文件需要PersonController ,然后在PersonController上存根方法。 ctrlFunc对象

      var PersonCtrl = require('../../../api/controllers/PersonController'); stub = sinon.stub(PersonCtrl.ctrlFunc, 'retreiveData', function(cb) { console.log('into stub function'); cb("Some stub data"); }); 

现在放在一起:

  • 控制器文件

     // 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; } 
  • testing文件:

     // 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(); }); }); }); 
  • testing现在是成功的

     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)