1

我正在尝试为 Ember 视图编写一个基本测试,如下所示:http: //shairez.com/2012/07/ember-js-tdd-how-to-test-your-ember-views/但我保留得到一个“未捕获的类型错误:无法调用未定义的方法‘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()inside 。Ember.run

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

Spec.js.coffee

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

应用程序/资产/javascripts/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 .

应用程序/资产/javascripts/syssys.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()
4

1 回答 1

0

只有在元素被插入到 DOM 之后才能调用“this.$()”。由于您注意到您仍处于“preRender”状态,而不是 DOM(“inDom”),原因可能是“reRender”(请检查调用堆栈)。
这可能发生(例如)当使用 bindAttr 并且它绑定到的属性已经被修改时,即使视图没有插入到 DOM (*cough* call-stack *cough*)。

于 2012-12-16T14:18:37.943 回答