测试Ember.js和runloop

时间:2012-04-01 10:44:39

标签: ember.js

在生产中运行代码时,我不必与Ember.js runloop进行交互,但在我的测试中,我有时必须调用Enber.run.end()来使测试通过。这可能会导致其他测试失败的影响。

例如,这是我的spec_helper:

beforeEach ->
  $('#jasmine_content').append('<div id="fieldset"></div>')
  Ember.test = true
  Lead.run()

$ ->
  $('body').append($('<div id="jasmine_content"></div>'))

我在上面的代码中将Ember.test标志设置为true,我不完全确定这是做什么的。

Lead.run()创建Ember应用程序:

window.Lead = Ember.Application.create
  Controllers: {Leads: {}}
  Models: {}
  Views: {}

  run: ->
    @initEvents()
    @.set('search', Lead.Controllers.UrlSearch.create())
    # etc.

在某些测试中,我发现自己必须调用ember.run.end()来确保项目在DOM等中。

describe 'Controllers', ->
  describe 'UrlSearch', ->
    it 'should append view', ->
      Ember.run.end() 
      expect($('#goButton').length).toEqual(1)

从个别测试中结束runloop感觉不对。

每当我将spec_helper更新为:

beforeEach ->
  $('#jasmine_content').append('<div id="fieldset"></div>')
  Ember.test = true
  Lead.run()
  Ember.run.end()

我收到如下错误消息:

  

无法对不在DOM中的Metamorph执行操作

  

必须有当前的运行循环。

是否有任何关于通过测试协商runloop的指导或最佳实践?

1 个答案:

答案 0 :(得分:1)

您应该查看测试,例如each_test.js。如您所见,将视图添加到DOM或操纵控制器的属性,...始终在Ember.run内完成,以确保刷新所有更改和视图更新并同步绑定:

Ember.run(function(){
  view.append();
  ...
});