我正在尝试存根帆控制器功能,但我不知道哪个对象到存根。
运用
sinon.stub(object,'funcname', function()...
这可能与sails绑定控制器函数的方式有关...
以下是一些代码示例
控制器文件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
};
测试文件:
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文件: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);
});
我正在运行测试:
NODE_ENV=test mocha test/bootstrap.test.js test/api/**/*.js
并获得:
TypeError: Attempted to wrap object property retreivedata as function
答案 0 :(得分:2)
这是一个可能的解决方案。
控制器从 ctrlFunc 对象
调用该函数var ctrlFunc = {
retreiveData: retreiveData,
};
function showdata(req, res) {
ctrlFunc.retreiveData(function (data) {
res.send(data);
});
};
控制器需要在测试期间导出 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;
}
测试文件需要 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;
}
测试文件:
// 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();
});
});
});
测试现已成功
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)