当前位置 : 主页 > 网页制作 > Nodejs >

node.js – sails.js mocha supertest sinon:如何存根sails.js控制器函数

来源:互联网 收集:自由互联 发布时间:2021-06-16
我试图存根一个sails控制器函数,但我不知道哪个对象存根. 运用 sinon.stub(object,’funcname’,function()… 这可能与sails绑定控制器函数的方式有关… 这是一些代码示例 控制器文件api / contro
我试图存根一个sails控制器函数,但我不知道哪个对象存根.
运用
    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
这是一个可能的解决方案.

> Controller从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对象的stub方法

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)
网友评论