Sinon + Backbone specification does not work under Jasmine Headless Webkit, but runs with standalone Jasmine

I have a specification for the Backbone collection (todos, of course) that uses Sinon to fake a server response with binding data. This runs with standalone Jasmine, but does not work under the Jasmine Headless Webkit setup.

Error:

Todos collection when fetching models from the server should parse todos from the response. Expected 0 to equal 2. (line ~58) expect(this.todos.length).toEqual(this.fixture.response.todos.length); 

Sinon and my device correctly return a fake answer with 2 todos, but no todos are parsed in the collection.

There is a scenario showing all this while working with Jasmine standalone here

The boot order for My Jasmine Headless Webkit is as follows:

 clyde:backbone-jasmine andy$ jasmine-headless-webkit -l /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine-html.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine.css /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine-extensions.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/intense.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/headless_reporter_result.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine.HeadlessConsoleReporter.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jsDump.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/beautify-html.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery_ujs.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/json2.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/underscore.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/backbone.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/backbone-rails.js /Users/andy/Code/backbone-jasmine/app/assets/javascripts/app/collections/todos.js.coffee /Users/andy/Code/backbone-jasmine/app/assets/javascripts/app/models/todo.js.coffee /Users/andy/Code/backbone-jasmine/app/assets/javascripts/application.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/jasmine-jquery.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/sinon.js /Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/jasmine-sinon.js /Users/andy/Code/backbone-jasmine/spec/javascripts/helpers/spec_helper.js.coffee /Users/andy/Code/backbone-jasmine/spec/javascripts/helpers/valid_response.js.coffee /Users/andy/Code/backbone-jasmine/spec/javascripts/fixtures/todos_fixture.js.coffee /Users/andy/Code/backbone-jasmine/spec/javascripts/app/models/todo_spec.js.coffee /Users/andy/Code/backbone-jasmine/spec/javascripts/app/collections/todos_spec.js.coffee 

And the code (also in the fiddle, of course):

 # abbreviated todo model class window.Todo extends Backbone.Model # complete todos collection class window.Todos extends Backbone.Collection model: window.Todo url: "/todos" comparator: (todo) -> todo.get('priority') parse: (res) -> res.response.todos # spec/javascripts/fixtures/todos_fixture.js.coffee beforeEach -> @fixtures = Todos: valid: status: "OK" version: "1.0" response: todos: [ id: 1 title: "Paint the fence" , id: 2 title: "Wash the dog" ] # spec/javascripts/helpers/valid_response.js.coffee beforeEach -> @validResponse = (responseText) -> [ 200, "Content-Type": "application/json", JSON.stringify responseText ] # abbreviated todo spec (full spec in fiddle) describe "Todos collection", -> describe "when fetching models from the server", -> beforeEach -> @todo = sinon.stub(window, "Todo") @todos = new Todos() @fixture = @fixtures.Todos.valid @server = sinon.fakeServer.create() @server.respondWith "GET", "/todos", @validResponse(@fixture) afterEach -> @server.restore() @todo.restore() it "should parse todos from the response", -> @todos.fetch() @server.respond() expect(@todos.length).toEqual @fixture.response.todos.length expect(@todos.get(1).get('title')).toEqual @fixture.response.todos[0].title 

Some of the tools used are new to me, so I really appreciate any help - thanks!

+6
source share
1 answer

Maybe there is something asynchronous in server.respond() . Have you tried this?

 it "should parse todos from the response", -> @todos.fetch() @server.respond() waits 500 runs -> expect(@todos.length).toEqual @fixture.response.todos.length expect(@todos.get(1).get('title')).toEqual @fixture.response.todos[0].title 
0
source

Source: https://habr.com/ru/post/915413/


All Articles