Stub类实例方法返回已解析的Promise(使用Sinon)

时间:2016-12-02 22:20:30

标签: node.js express sinon es6-promise

我正在为Node Express应用程序编写控制器单元测试。

控制器创建模型类的实例,然后调用其返回已解析的Promise的方法之一。我需要将类构造函数和方法存根,以便它返回一个用测试数据解析的Promise。

控制器:

const Model = require('../../models/model');

module.exports = function (req, res, next) {
    const instance = new Model(req.body);

    instance.method()
        .then(result => {
            // do something with result
        })
        .catch(err => next(err));
};

测试

const proxyquire = require('proxyquire');
const sinon = require('sinon');
require('sinon-as-promised');

const Model = require('../../../../server/models/model');

const stubs = {
    model: sinon.stub(Model.prototype, 'method', function () { sinon.stub().resolves('foobar') })
};

const subject = proxyquire('../../../../server/controllers/models/method', {
    '../../models/model': stubs.model
});

Sinon.JS Documentation Stub API说:

var stub = sinon.stub(object, "method", func);

  

用func替换object.method,用间谍包裹。

但是当测试代码在控制器中命中.then时,我收到此错误:

  

instance.method(...)。然后不是函数

直接在存根上调用.resolves()(来自sinon-as-promised)将then/catch/finally方法提供给类实例而不是类实例方法根据需要:

sinon.stub(Model.prototype, 'method').resolves('foobar')

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您需要从存根函数返回sinon.stub().resolves('foobar')

const stubs = {
  model: sinon.stub(Model.prototype, 'method',
    function () { return sinon.stub().resolves('foobar') })
};

但是你可能只是更好地返回一个原生的Promise,因为你没有保留对内部存根的引用:

const stubs = {
  model: sinon.stub(Model.prototype, 'method',
    function () { return Promise.resolve('foobar') })
};

答案 1 :(得分:1)

已经发现了这个解决方案,你自己制作假模型:

const proxyquire = require('proxyquire');
const sinon = require('sinon');
require('sinon-as-promised');

const methodStub = sinon.stub().resolves('foobar');

const ModelStub = function () {
    this.method = methodStub;
};

const subject = proxyquire('../../../../server/controllers/models/method', {
    '../../models/model': ModelStub
});

信用转到Darren Hurley