我正在尝试为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>
(正如预期的那样),this
是myView
。但是,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()
答案 0 :(得分:0)
只有在将元素插入DOM后才可以调用“this。$()”。既然你注意到你仍处于'preRender'状态,而且尚未进入DOM('inDom'),原因可能是“reRender”(请检查调用堆栈)。
这可能发生(例如)使用bindAttr时,即使未将视图插入DOM(* cough * call-stack * cough *),已绑定的属性也已修改。