node.js – 如何测试存根数据库查询

我有一个看起来像这样的Sails.Js控制器

module.exports = {
  confirmID: function(req,res) {
    var uid = req.params.id;
     User.findOne({id:uid}).exec(function(err,user) {
       // ...
     });
  }
}

用户是sails-postgres模型.我尝试用mocha,sinon和supertest测试它,并进行这样的测试

describe('Controller', function() {
  var sandbox;

  before(function() {
    sandbox = sinon.sandbox.create();
    sandbox.stub(User, 'findOne');
  });

  after(function() {
    sandbox.restore();
  });

  describe('GET /confirmid/:id', function() {

    it('should do something', function(done) {
      request(sails.hooks.http.app)
        .get('/confirmid/123')
        .expect(200)
        .end(function(err,res) {
          sandbox.fakes[0].called.should.be.true;
          done();
        });
  });
});

如果我把它留在那里它会出错,因为exec是在undefined上调用的,但我似乎无法在没有错误或测试挂起的情况下存根嵌套的exec方法.有没有办法存根一系列方法调用,如.find().exec()?或者我最好将其留给集成测试,在那里我可以用实际的数据库进行测试?

最佳答案
假设您确实想要存根(不仅仅是间谍) – 您希望控制查询解析的内容,而不是简单地知道查询是否已执行.这是我用于stub sails/waterline query methods的东西.有点像……

var stubQueryMethod = require('stubQueryMethod');

describe('Controller', function() {
  before(function() {
    stubQueryMethod(User, 'findOne', {
      id: 123,
      name: 'Fred Fakes'
    });
  });

  after(function() {
    User.findOne.restore();
  });

  describe('GET /confirmid/:id', function() {
    it('should do something', function(done) {
      request(sails.hooks.http.app)
        .get('/confirmid/123')
        .expect(200)
        .end(function(err,user) {
          user.should.have.property('name', 'Fred Fakes');
          done();
        });
    });
  });
});

资料来源:https://gist.github.com/wxactly/f2258078d802923a1a0d

转载注明原文:node.js – 如何测试存根数据库查询 - 代码日志