2014-10-30 11 views
6

Próbuję napisać test do ujawnienia danych wprowadzanych przez użytkownika w zapytaniu. Funkcja jest określona na szkielecie Widok:Jak przetestować odbicia LoDash w Jasmine przy pomocy Sinon fakeTimer?

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

    // init, render, etc. 

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

Początkowo biblioteka szkieletowe (v0.9.10) stosowane podkreślenia (v1.4.4), a test został zdefiniowany następująco:

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(); 
     }); 
    }); 
}); 

jednak , teraz chcę włączyć LoDash zamiast Underscore. Korzystając z najnowszej kompatybilności z Underscore na ich stronie (LoDash 2.4.1/Underscore 1.5.6), wszystkie moje testy przechodzą z wyjątkiem tego, który używa _.debounce!

Zrobiłem kilka badań i natknąłem się na te relevantissues, aby utworzyć kompresję spod znaku LoDash z runInContext, ale nie mam pojęcia, jak go użyć z powodu braku przykładów. Jak mogę użyć _.runInContext() w mojej specyfikacji, aby pracować z sinon.fakeTimer?

Odpowiedz

4
SearchView = Backbone.View.extend({ 
    events: { 
     "input .search-input": function() { 
      this.search(); 
     } 
    }, 

    initialize: function() { 
     this.search = _.debounce(this.search, 200); 
    } 

    // init, render, etc. 

    search: function() { 
     this.collection.fetch(); 
    } 
});  

describe("SearchView", function() { 
    var view; 
    var $viewContainer; 
    var clock; 
    var lodash = window._; 

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

     clock = sinon.useFakeTimers(); 
     window._ = _.runInContext(window); 

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

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

     clock.restore(); 
     window._ = lodash; 
    }); 

    //... 

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

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

     afterEach(function() { 
      collectionStub.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(); 
     }); 
    }); 
}); 
+1

Niestety, nie rozumiem, ale ustawiłeś 'clock = sinon.useFakeTimers();' i później użyj innego var 'fakeTimer.tick (199)'. Błąd? – syabro

3

Trzeba dodać tę linię

_ = _.runInContext(window); 

przed stworzeniem (nie startowych) z SearchView lub wezwanie _.debounce(). Tak powinno być zaraz po włączeniu Lo-Dash.

Umożliwia to uruchamianie lodash w kontekście okna globalnego, dzięki czemu można użyć zastępowanego przez SinonJSsetTimeout.

+0

Dzięki! Przetestuję to dzisiaj i pójdę później po południu. – SirTophamHatt

+0

'Błąd składniowy:" _ "jest tylko do odczytu' –

+0

Prawdopodobnie używasz 'const' zamiast' let' –

Powiązane problemy