Как протестировать дребезг LoDash в Jasmine с помощью Sinon fakeTimer?

Я пытаюсь написать тест для устранения дребезга пользовательского ввода в поисковом запросе. Функция определена в Backbone View:

SearchView = Backbone.View.extend({
    events: {
        "input .search-input": "search"
    },

    // init, render, etc.

    search: _.debounce(function() {
        this.collection.fetch();   
    }, 200)
});

Первоначально библиотека Backbone (v0.9.10) использовала Underscore (v1.4.4), а тест был определен следующим образом:

describe("SearchView", function() {
    var view, $viewContainer;

    beforeEach(function() {
        appendSetFixtures('<div class="jasmine-container"></div>');
        $viewContainer = $(".jasmine-container");

        view = new SearchView({
            el: $viewContainer
        });
    });

    afterEach(function() {
        view.remove();
        view.cleanup();
    });

    //...

    describe("wires the search input", function() {
        var collectionStub,
            fakeTimer;

        beforeEach(function() {
            collectionStub = sinon.stub(
                SearchResultsCollection.prototype,
                "fetch"
            );     

            fakeTimer = sinon.useFakeTimers();
        });

        afterEach(function() { 
            collectionStub.restore();
            fakeTimer.restore();
        });

        it("should not trigger a search before 200ms", function() {
            fakeTimer.tick(199);
            expect(collectionStub).not.toHaveBeenCalled();
        });

        it("should trigger a search after 200ms", function() {
            fakeTimer.tick(200);
            expect(collectionStub).toHaveBeenCalled();
        });
    });
});

Однако теперь я хочу включить LoDash вместо Underscore. Используя последнюю сборку совместимости с Underscore на их сайте (LoDash 2.4.1 / Underscore 1.5.6), все мои тесты проходят, кроме одного с использованием _.debounce!

Я провел небольшое исследование и наткнулся на эти актуальные issues для создания сборки LoDash Underscore с runInContext, но я понятия не имею, как ее использовать из-за отсутствия примеров. Как я могу использовать _.runInContext() в своих спецификациях для работы с sinon.fakeTimer?


person SirTophamHatt    schedule 30.10.2014    source источник


Ответы (2)


Вам нужно добавить эту строку

_ = _.runInContext(window);

перед созданием (не инициализацией) SearchView или любым вызовом _.debounce(). Так и должно быть сразу после включения Lo-Dash.

Это позволяет вам запускать lodash в глобальном контексте окна, поэтому вы можете использовать переопределенные SinonJS setTimeout.

person Eugene Glova    schedule 01.11.2014
comment
Спасибо! Я проверю это сегодня и продолжу позже во второй половине дня. - person SirTophamHatt; 03.11.2014
comment
Вероятно, вы используете const вместо let - person Eugene Glova; 04.12.2017

person    schedule
comment
Извините, я не понимаю, но вы установили clock = sinon.useFakeTimers();, а позже использовали другую переменную fakeTimer.tick(199). Ошибка? - person syabro; 20.04.2016
comment
@syabro Я уверен, что код какой-то ошибочный. - person Yonggoo Noh; 10.07.2018