Метод экземпляра класса Stub для возврата разрешенного обещания (используя Sinon)

Я пишу тесты контроллера для приложения Node Express.

Контроллер создает экземпляр класса модели, а затем вызывает один из его методов, который возвращает разрешенное обещание. Мне нужно заглушить конструктор класса, а затем метод, чтобы он возвращал обещание, разрешенное с помощью тестовых данных.

контроллер:

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 Документация Stub API говорит:

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

Заменяет object.method на func, завернутый в шпион.

Но я получаю эту ошибку, когда тестовый код попадает .thenв контроллер:

instance.method (...), то это не функция

Вызов .resolves()(из sinon-as-promised) непосредственно на заглушке дает then/catch/finallyметоды экземпляру класса, а не методу экземпляра класса, как требуется:

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

Заранее благодарим за помощь!

node.js,express,sinon,es6-promise,

0

Ответов: 2


2

Вам нужно вернуться sinon.stub().resolves('foobar')из вашей функции заглушки.

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

Но вам, вероятно, просто лучше вернуться к родному обещанию, поскольку вы не держите ссылку на внутреннюю заглушку:

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

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
});

Кредит идет к Даррену Херли .

Node.js, выразить иначе SS6-обещание,
Похожие вопросы