Sinon - по своей сути (на минутку забудь lolex
и nise
) - явно имеет дело с заглушкой и слежкой за функциями javascript.Вот и все.Он не имеет отношения к загрузчикам модулей или Node как таковым .
Так что он не знает, как подключиться к загрузчику модулей Node (require
) и отключить зависимости самостоятельно.В общем случае у вас есть два варианта:
- Обеспечьте свой модуль (тестируемая система) точками впрыска (скажем,
function setRequestModule(module){ request = module }
, которые можно использовать для питания заглушки Sinon. - Использование уровня связи для перехвата вызовов системы модулей для загрузки зависимостей и их замены. См. эту статью в разделе с инструкциями Sinon , чтобы узнать, как это сделать.
Это был общий случай, но так как вы имеете дело с заглушкой сетевого уровня, существует третий вариант, связанный со вторым, который включает в себя подключение к слою http в Node и настройку fakeзапросы и ответы там с использованием nock
.
Это будет выглядеть так:
const nock = require('nock')
const scope = nock('https://api.github.com')
.get('/repos/atom/atom/license')
.reply(200, {
license: {
key: 'mit',
name: 'MIT License',
spdx_id: 'MIT',
url: 'https://api.github.com/licenses/mit',
node_id: 'MDc6TGljZW5zZTEz',
},
})
Это то, что я обычно делаю, но, поскольку вы настаиваете на использовании только Sinon, вы остаетесь спервый вариант.
Разработка первого варианта: ввести зависимости
Ваши функции 2
и 3
(недопустимые идентификаторы JavaScript, кстати) зависят отмодуль request
и его метод get
для получения результатов.Чтобы иметь возможность контролировать то, что возвращает request.get
, вам нужно будет предоставить вашему модулю другую версию request
для ваших тестов.Это можно сделать с помощью внедрения зависимостей.
Для начала я предполагаю, что ваша функция начинается с импорта модуля request
, то есть первые несколько строк содержат оператор, выглядящий следующим образом:
const request = require('request');
Вам нужно изменить это утверждение, чтобы константа request
могла быть заменена, то есть теперь она будет выглядеть следующим образом:
let request = require('request');
Чтобы иметь возможность контролировать свою зависимость, теперь вы можете добавитьновая функция для ваших экспортов:
module.exports.setRequestModule = function (stub){
request = stub;
}
Чтобы использовать это в своих тестах, вам нужно будет сделать это в своих тестах:
const myModule = require('../src/my-module');
const myRequestStub = {};
myModule.setRequestModule(myRequestStub);
it('should return the expected response', () => {
const expectedOutput = "with some response";
myRequestStub.get = function (url, callback) {
callback(null, expectedOutput);
}
myModule.doSomething() ...
// do test
});
В качестве альтернативы Вы может также выставить объект запроса в вашем модуле:
module.exports._request = request;
Затем вы можете, например, использовать sinon
, чтобы инструментировать его, заглушив метод get
из ваших тестов.
const myModule = require('../src/my-module');
sinon.stub(myModule._request, 'get').callsFake( (url, cb) => cb("hello!") );