sails.js +摩卡+超级测试+ sinon:如何对sails.js控制器函数进行存根 [英] sails.js + mocha + supertest + sinon: how to stub sails.js controller function

查看:82
本文介绍了sails.js +摩卡+超级测试+ sinon:如何对sails.js控制器函数进行存根的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对Sails控制器功能进行存根,但是我不知道要存根哪个对象. 使用 sinon.stub(object,'funcname', function()...

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...

下面是一些示例代码

控制器文件api/controllers/PersonController.js

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

测试文件:

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

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

我正在测试:

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

并获取:

TypeError: Attempted to wrap object property retreivedata as function

推荐答案

这是一个可能的解决方案.

Here is a possible solution.

  • 控制器从 ctrlFunc 对象

var ctrlFunc = {
   retreiveData: retreiveData,
};
function showdata(req, res) {
        ctrlFunc.retreiveData(function (data) {
        res.send(data);
    });
};

  • 控制器在测试期间需要导出 ctrlFunc 对象(sinon.stub需要访问 ctrlFunc )

  • 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;
    }
    

  • 测试文件需要 PersonController ,然后在 PersonController 上存根方法. 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");
        });
    

  • 我们现在在一起:

    • 控制器文件

    • 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)
    

  • 这篇关于sails.js +摩卡+超级测试+ sinon:如何对sails.js控制器函数进行存根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆