Jasmine,Ember Views和Runloop:无法调用undefined方法'appendTo'

时间:2012-12-13 19:23:34

标签: ember.js jasmine

我正在尝试为Ember视图编写一个基本测试,跟着这里:http://shairez.com/2012/07/ember-js-tdd-how-to-test-your-ember-views/但是我一直得到一个“未捕获的TypeError:无法调用方法'appendTo'的未定义'。

规格:

describe "my view", ->

  myView = null

  beforeEach ->
    myView = Sysys.ActView.create()
    Ember.run ->
      myView.append()


  afterEach ->
    Ember.run ->
      myView.remove()
    myView = null

  it "should be defined", ->
    expect(myView).toBeDefined()

  it "should have a button", ->
    expect(myView.$("button.btn-primary").length).toEqual(1);

错误来自Ember.View.appendTo

this.$().appendTo(target)

其中target<body class="ember-application">...</body>(正如预期的那样),thismyView。但是,this.state是“preRender”并且this.$()未定义,这就是错误发生的原因。

我不确定我做错了什么:我认为视图已经创建但没有渲染。我也在append()内调用了Ember.run,如教程所示。

我还注意到即使我没有运行任何测试,我仍然会得到一个未被捕获的异常 - 除了ApplicationView之外,它是一样的。所以我想知道我是否正确地为测试初始化​​所有内容。包含文件位于下方(使用Rails 3.2和资产管道)

Spec.js.coffee

#=require_tree ./
#=require_tree ../../app/assets/javascripts

应用程序/资产/ Javascript角/ application.js.coffee:

#= require jquery
#= require jquery_ujs

#= require vendor/handlebars-1.0.0.beta.6
#= require vendor/ember-1.0.0-pre.2
#= require vendor/ember-data

#= require_self
#= require sysys
Sysys = Ember.Application.create();
#= require_tree .

应用程序/资产/ Javascript角/ sysys.js.coffee:

#= require ./store
#= require_tree ./models
#= require_tree ./controllers
#= require_tree ./views
#= require_tree ./helpers
#= require_tree ./templates
#= require_tree ./routes
#= require_self

Sysys.initialize()

1 个答案:

答案 0 :(得分:0)

只有在将元素插入DOM后才可以调用“this。$()”。既然你注意到你仍处于'preRender'状态,而且尚未进入DOM('inDom'),原因可能是“reRender”(请检查调用堆栈)。
这可能发生(例如)使用bindAttr时,即使未将视图插入DOM(* cough * call-stack * cough *),已绑定的属性也已修改。