用Node和Rewire对端点控制器进行单元测试



我使用rewire来测试我的节点控制器。我有以下端点,它使用request来获取一些数据。

    exports.myGetEndpoint = function(req, res) {
      return request.get({
        url: 'http://baseURL/api/myGetEndpoint',
        headers: {
          authorization: { //etc }
        },
        json: true
      })
      .then(function(data) {
        res.status(200).json(data.objects);
      });
    };

我想测试,当我从控制器调用get方法时,request得到正确的参数调用,但我失去了如何在请求时"存根"或"间谍"。

    var Promise    = require('bluebird');
    var rewire     = require('rewire');
    var controller = rewire('../../controllers/myGetEndpoint.js');
    var request = {
      get: sinon.stub()
    };
    // Use rewire to mock dependencies
    controller.__set__({
      request: request
    });
    describe('myGetEndpoint', function() {
      var json;
      var req;
      var res;
      beforeEach(function(done) {
        json = sinon.spy();
        req = { headers: {} };
        res = {
          status: sinon.stub().returns({
            json: json
          })
        };
        controller.myGetEndpoint(req, res).then(function() {
          done();
        });
      });
      it('should call the correct request arguments', function() {
        // lost
      });
    });

我要修改一点你的源代码,只使用回调而不是承诺。我需要研究如何用sinon存根一个承诺,但是你可以得到一个关于如何用一个简单的回调来测试它的想法:

exports.myGetEndpoint = function(req, res) {
  return request.get({
    url: 'http://baseURL/api/myGetEndpoint',
    headers: {
      authorization: { //etc }
    },
    json: true
  }, function (error, response, body) {
    res.status(200).json(response.objects);
  });
};

你不应该在beforeEach中调用控制器,而必须在测试用例中调用它。beforeEach通常用于在测试用例之前进行初始化:

var expect = require('chai').expect;
var Promise    = require('bluebird');
var rewire     = require('rewire');
var controller = rewire('../../controllers/myGetEndpoint.js');
var request = {
  get: sinon.stub()
};
// Use rewire to mock dependencies
controller.__set__({
  request: request
});
describe('myGetEndpoint', function() {
  var status;
  var json;
  var req;
  var res;
  beforeEach(function(done) {
    json = sinon.spy();
    status = sinon.stub();
    req = { headers: {} };
    res = {
      status: status.returns({
        json: json
      })
    };
  });
  it('should call the correct response arguments', function(done) {
    var response = {objects: ['objects', 'objects']}
    request.get.yields(null, response);
    controller.myGetEndpoint(req, res);
    expect(status.calledWith(200)).to.equal(true);
    expect(json.calledWith(response.objects)).to.equal(true);
  });
});

注::我实际上并没有试着运行它,所以可能有一些拼写错误。

最新更新