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)
- 加快meteortesting刷新
- 使用伊斯坦布尔对Node微服务进行集成testing
- 在Mocha中依次运行两个不同的testing文件
- 如何在事件处理程序中进行asynchronous调用?
- 我如何testing一个基本的JavaScript文件与摩卡?
- 运行只有一个摩卡testing文件的变化与吞噬
- 使用grunt-mocha-test创buildtesting组
- sinon没有正确恢复stubbed原型的方法?
- Sails.js和Mocha:使用supertest:path问题,当控制器在像api \ controllers这样的coustom文件夹被移动到api \ controllers \ admin