Nano Hash - криптовалюты, майнинг, программирование

sinonjs: заглушка sinon не работает с экспортируемой функцией

Я не могу заглушить функцию functionToStub, когда я require в файле контроллера, для которого я пишу тест мокко.

Вот пример того, чего я пытаюсь достичь

file1.js -- файл контроллера

const functionUtil = require('./useFunc');

const newEndpoint = (req, res) => {

if(functionUtil.functionToStub()){
                    return "DID NOT STUB"
                }
                else{
                  return "DID STUB"
                }

}

useFunc.js

var functions = {
    functionToStub: functionToStub
}
function functionToStub (){
    return true
}

module.exports = functions;

мокко.js

const featureUtil = require('/useFunc')

   describe('When I call endpoint to stub', (done) => {
        var newStub;
        before(function(done) {

            newStub = sinon.stub(featureUtil, 'functionToStub')
            newStub.returns(false)

            chai.request(app.start())
            .post(`/api/testMyStub`)
            .send({'test':'testBody'})
            .end((err, res) => {
             console.log(res.body) // Expecting DID STUB to print here but the stub doesn't work, prints DID NOT STUB
             done();
            });
        });
        after(function(done) {
            newStub.restore();
            done();
        })
        it('should send an request', (done) => {
            expect(newStub).to.have.been.calledOnce
            done()

        }); 

    });

  • Ну, вы вызываете функцию functionToStub в своем операторе if, и эта функция возвращает только true — она никогда не будет регистрировать DID STUB. 26.03.2020
  • @chazsolo, могу ли я не отключать функцию functionToStub, чтобы она возвращала false? 26.03.2020
  • Вы можете, но это не будет работать, как вы настроили свою конечную точку. Функция конечной точки имеет ссылку на импортированный functionToStub, а не на вашу заглушку. У вас есть несколько вариантов, таких как внедрение зависимостей или proxyquire/rewire/и т. д. 26.03.2020
  • @chazsolo Я смог заглушить его с помощью proxyquire. Спасибо! 26.03.2020

Ответы:


1

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

const featureUtil = require('/useFunc')
var proxyquire =  require('proxyquire')

isLegacyPrintingEnabledStub = sinon.stub(featureUtil, 'functionToStub')
var isLegacyPrintingEnabledUtil = proxyquire('../../api/controllers/file1', {"featureUtil" : {'functionToStub': stubbedFunction }});
stubbedFunction.returns(false)

describe('When I call endpoint to stub', (done) => {

        before(function(done) {

            chai.request(app.start())
            .post(`/api/testMyStub`)
            .send({'test':'testBody'})
            .end((err, res) => {
             console.log(res.body) // Logs DID STUB as expected
             done();
            });
        });
        after(function(done) {
            newStub.restore();
            done();
        })
        it('should send an request', (done) => {
            expect(stubbedFunction).to.have.been.calledOnce
            done()

        }); 

    });

После этого я смог увидеть, как код возвращает DID STUB ожидаемым образом.

26.03.2020

2

Более простой способ для меня: у меня такая же проблема, когда я хочу stub для export function().... Это не работает. Поэтому я конвертирую export function() для использования функции стрелки: export const nameFunction = ()...

Со стрелочной функцией работает нормально.

29.07.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..