单位测试mongoose承诺与sinon

时间:2016-05-06 03:42:19

标签: node.js unit-testing mongoose bluebird es6-promise

我正在尝试对使用promises的猫鼬对象进行单元测试。我已经在下面编写了测试,但是它有效,但它还没有完成。我无法弄清楚如何测试'然后'或者'赶上'方法被称为。

如何使用间谍检查'然后'解析promise时会调用method吗?

测试方法

export function create(req, res) {
  User
    .createAsync(req.body)
    .then(handleCreate(res, req.originalUrl))
    .catch(handleError(res));
}

单元测试

it('should do something', () => {
  const req = {
    body: 45,
  };

  const res = {};

  const mockRole = sandbox.mock(Role).expects('createAsync').once().withArgs(45)
    .returns(Promise.resolve());

  controller.create(req, res);
});

我使用的解决方案更新(2016年5月6日)

感谢@ReedD帮助我朝着正确的方向前进

虽然这"有效,但我觉得我比我的代码更多地测试了promises的功能。

it('should call create with args and resolve the promise', () => {
  const createSpy = sinon.spy();
  const errorSpy = sinon.spy();

  sandbox.stub(responses, 'responseForCreate').returns(createSpy);
  sandbox.stub(responses, 'handleError').returns(errorSpy);

  sandbox.mock(Role).expects('createAsync').once().withArgs(45)
    .returns(Promise.resolve());

  return controller.create(req, res).then(() => {
    expect(createSpy.calledOnce).to.be.equal(true);
    expect(errorSpy.calledOnce).to.be.equal(false);
  });
});

1 个答案:

答案 0 :(得分:1)

您可以将handleCreatehandleError添加到module.exports,然后制作那些存根或间谍。以下是我认为您尝试做的事情的一个例子。我还以为你使用的是sinon / chai。

http://ricostacruz.com/cheatsheets/sinon-chai.html

// controller.js

module.exports = {
    handleCreate: function () {
        // ..code
    },
    handleError: function () {
        // ..code
    },
    create: function (req, res) {
        User
            .createAsync(req.body)
            .then(this.handleCreate(res, req.originalUrl))
            .catch(this.handleError(res));
    }
};



// test/test.js

var controller = require('../controller');

it('should do something', function (done) {

    var handleCreate = sandbox.spy(controller, 'handleCreate');
    var handleError  = sandbox.spy(controller, 'handleError');
    var mockRole     = sandbox
        .mock(Role)
        .expects('createAsync')
        .once().withArgs(45)
        .returns(Promise.resolve());


    var req = {
        body: 45,
    };

    var res = {
        send: function () {
            expect(handleCreate).to.be.calledOnce;
            expect(handleError).to.not.be.called;
            done();
        }
    };

    controller.create(req, res);
});