Mocko / stubing mongoose findById with sinon

时间:2014-03-01 11:54:12

标签: node.js mongoose mocha sinon

我正在尝试删除我的猫鼬模型,特别是mongoose的findById方法

当我用'abc123'调用findById时,我试图让mongoose返回指定的数据

这是我到目前为止所拥有的:

require('../../model/account');

sinon = require('sinon'),
mongoose = require('mongoose'),
accountStub = sinon.stub(mongoose.model('Account').prototype, 'findById');
controller = require('../../controllers/account');

describe('Account Controller', function() {

    beforeEach(function(){
        accountStub.withArgs('abc123')
            .returns({'_id': 'abc123', 'name': 'Account Name'});
    });

    describe('account id supplied in querystring', function(){
        it('should retrieve acconunt and return to view', function(){
            var req = {query: {accountId: 'abc123'}};
            var res = {render: function(){}};

            controller.index(req, res);
                //asserts would go here
            });
    });

我的问题是我在运行mocha时遇到以下异常

  

TypeError:尝试将未定义属性findById包装为函数

我做错了什么?

2 个答案:

答案 0 :(得分:3)

看看sinon-mongoose。您可以只用几行来预测链式方法:

// If you are using callbacks, use yields so your callback will be called
sinon.mock(YourModel)
  .expects('findById').withArgs('abc123')
  .chain('exec')
  .yields(someError, someResult);

// If you are using Promises, use 'resolves' (using sinon-as-promised npm) 
sinon.mock(YourModel)
  .expects('findById').withArgs('abc123')
  .chain('exec')
  .resolves(someResult);

您可以在回购中找到工作示例。

另外,建议:使用mock方法代替stub,这将检查方法是否真的存在。

答案 1 :(得分:1)

由于您似乎正在测试单个班级,因此我将使用通用

滚动
var mongoose = require('mongoose');
var accountStub = sinon.stub(mongoose.Model, 'findById');

这会将对Model.findById已修补by mongoose的任何来电存根。