While running code in production, I don’t have to interact with the Ember.js runloop but in my tests, I sometimes have to call Enber.run.end() to make the tests pass. This might have knock on effects of making other tests fail.
For example, here is my spec_helper:
beforeEach ->
$('#jasmine_content').append('<div id="fieldset"></div>')
Ember.test = true
Lead.run()
$ ->
$('body').append($('<div id="jasmine_content"></div>'))
I am setting the Ember.test flag to true in the above code which I am not entirely sure what this does.
Lead.run() creates the Ember application:
window.Lead = Ember.Application.create
Controllers: {Leads: {}}
Models: {}
Views: {}
run: ->
@initEvents()
@.set('search', Lead.Controllers.UrlSearch.create())
# etc.
In some tests, I find myself having to call ember.run.end() to ensure that items will be in the DOM etc.
describe 'Controllers', ->
describe 'UrlSearch', ->
it 'should append view', ->
Ember.run.end()
expect($('#goButton').length).toEqual(1)
Ending the runloop from individual tests feels wrong.
Whenever I update my spec_helper to this:
beforeEach ->
$('#jasmine_content').append('<div id="fieldset"></div>')
Ember.test = true
Lead.run()
Ember.run.end()
I get error messages like:
Cannot perform operations on a Metamorph that is not in the DOM
or
Must have a current run loop.
Are there any guidance or best practices for negotiating the runloop from tests?
You should take a look at the tests, for example each_test.js. As you can see, adding the view to DOM or manipulating properties of controllers, … is always done within
Ember.runto assure all changes and view updates are flushed and the bindings are synced: