Ошибка модульного теста nodejs "sinon.restore не является функцией" - PullRequest
0 голосов
/ 30 апреля 2018

Привет, я пытаюсь написать модульные тесты, используя sinon, однако я не могу сбросить поведение моей заглушки при изменении sinon. Сначала у меня было

TypeError: Attempted to wrap getLastData which is already wrapped

После некоторых исследований я понял, что мне нужно сбросить sinon, но я получаю этот sinon.restore не является ошибкой функции. Кроме того, QueryHelper.getLastData () просто возвращает обещание, которое разрешается путем возврата сущности, подобной lastData

var assert = require('assert');
var sinon = require('sinon');
var proxyquire = require('proxyquire');
var ExchangeHandlerFactory = require('../handler.js');
var QueryHelper = require('../query-helper.js');

describe('BinanceHandler', function() {
    var binanceHandler;
    var config;

    before(function() {
        config = {
            exchange: 'binance',
            interval: '1h'
        };
        var ExchangeHandlerFactoryObj = proxyquire('../handler.js', 
                                            {"./config.js": config,
                                                "./query-helper.js": QueryHelper});
        binanceHandler = ExchangeHandlerFactoryObj.getExchangeHandler('binance', '1h')
    });

    afterEach(() => {
        QueryHelper.getLastData.restore();
    });

    describe('#buildGetMarketTickerUrl()', function() {
        it('binance handler should return correct buildGetMarketTickerUrl', async function() {
            var lastData = {
                            symbol: "BTC-VTC",
                            interval: "1h",
                            exchange: "binance",
                            dataSet: [
                                {
                                    "o" : 0.0006882,
                                    "h" : 0.00071,
                                    "l" : 0.0006882,
                                    "c" : 0.0007008,
                                    "bv" : 63.27676876,
                                    "t" : 1524963600000
                                }
                        ]};
            sinon.stub(QueryHelper, "getLastData")
                .withArgs({exchange: "binance", interval: "1h", symbol: "BTC-VTC"})
                .resolves(lastData);
            var marketUrl = await binanceHandler.buildGetMarketTickerUrl("VTC");
            assert.equal(marketUrl, 
                         "https://api.binance.com/api/v1/klines?symbol=VTCBTC&interval=1h&startTime=1524963600000");
        });
    });
});

ПРИМЕЧАНИЕ. Я также пытался QueryHelper.getLastData.restore() в блоке afterEach (). Но тогда я получаю QueryHelper.getLastData.restore не является ошибкой функции.

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Обходной путь, если кому-то нужно, вместо использования .withArgs(arg1, arg2) используйте .callsArgOn(index, context) и цепочку для нескольких:

stub.callsArgOn(1, arg1).callsArgOn(2, arg2)
...
stub.restore();

Проблема зарегистрирована sinon github

0 голосов
/ 30 апреля 2018

Я решил эту проблему, сначала создав заглушку QueryHelper в крючке beforeEach (). Вот исправление, которое я сделал.

beforeEach(function() {
    queryHelperStub = sinon.stub(QueryHelper, "getLastData");
});

afterEach(() => {
    queryHelperStub.restore();
});

describe('#buildGetMarketTickerUrl()', function() {
    it('binance handler should return correct buildGetMarketTickerUrl', async function() {
        var lastData = {
                        symbol: "BTC-VTC",
                        interval: "1h",
                        exchange: "binance",
                        dataSet: [
                            {
                                "o" : 0.0006882,
                                "h" : 0.00071,
                                "l" : 0.0006882,
                                "c" : 0.0007008,
                                "bv" : 63.27676876,
                                "t" : 1524963600000
                            }
                    ]};
        queryHelperStub.withArgs({exchange: "binance", interval: "1h", symbol: "BTC-VTC"})
                        .resolves(lastData);
        var marketUrl = await binanceHandler.buildGetMarketTickerUrl("VTC");
        assert.equal(marketUrl, 
                     "https://api.binance.com/api/v1/klines?symbol=VTCBTC&interval=1h&startTime=1524963600000");
    });
});

describe('#buildGetMarketTickerUrl()', function() {
    it('binance handler should return correct buildGetMarketTickerUrl with startTime and endTime params', async function() {
        queryHelperStub.withArgs({exchange: "binance", interval: "1h", symbol: "BTC-VTC"})
                        .resolves(null);
        var marketUrl = await binanceHandler.buildGetMarketTickerUrl("VTC");
        assert.equal(marketUrl,
                     "https://api.binance.com/api/v1/klines?symbol=VTCBTC&interval=1h");
    });
});
...