Nodejs mocha - невозможно тестировать обещания с помощью заглушек

Я пытаюсь выполнить модульное тестирование обещаний с помощью мокко, однако при тестировании обещаний у меня возникают две проблемы.

1) У меня Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

2) мое поведение requestStub не восстанавливается и не очищается после 1-го теста, что означает, что 2-й тест все еще зависит от первого поведения.

handler.js

"use strict";

var request = require('request');

class Handler {
    constructor() {};

    getMarketData(symbol) {
        return new Promise(function(resolve, reject) {
            request("https://api.binance.com/api/v1/klines?symbol = " + symbol + "BTC&interval=1h", 
                function(err, res, body) {
                    if (err) {
                        return reject(err);
                    }
                    return resolve(JSON.parse(body));
            });
        });
    }
}

module.exports = Handler;

обработчик-test.js

"use strict";

var assert = require('assert');
var sinon = require('sinon');
var proxyquire = require('proxyquire').noCallThru();

describe("Handler", function() {
    var handlerInstance;
    var requestStub;

    before(function() {
        requestStub = sinon.stub();
        var Handler = proxyquire("./handler.js", {"request": requestStub});
        handlerInstance = new Handler();
    });

    afterEach(function() {
        requestStub.restore;
    });

    describe("#getMarketData", function() {
        it("test 1", function() {
            var promise = handlerInstance.getMarketData("VTC");
            requestStub.withArgs(sinon.match.any, sinon.match.any).yields(null, null, JSON.stringify({symbol: "VTC"}));
            return promise.then(function(data) {
                assert.equals(data.symbol, "VTC");
            });
        });

        it("test 2", function() {
            var promise = handlerInstance.getMarketData("STRAT");
            requestStub.withArgs(sinon.match.any, sinon.match.any).yields(null, null, JSON.stringify({symbol: "STRAT"}));
            return promise.then(function(data) {
                assert.equal(data.symbol, "STRAT");
            });
        });
    });
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо настроить поведение requestStub перед вызовом getMarketData().

В тот момент, когда вы вызываете request() внутри getMarketData(), ему нечего делать. Таким образом, ваш обратный вызов никогда не вызывается, а время ожидания теста.

ох уж моя плохая :)

quartaela 02.05.2018 20:13

Другие вопросы по теме