el在视图中未定义测试骨干

时间:2015-05-15 00:29:31

标签: javascript unit-testing backbone.js

我想从骨干视图测试我的观点。但我遇到问题,我尝试使用this.$el获取我的视图元素,结果为空。当我检查this.el时,结果为undefined

当我尝试使用$('#container')搜索它时,它存在,当我运行它时,它也有效。标签存在, 这是我的观点代码

define([
  'jquery',
  'underscore',
  'backbone',
  'text!templates/setting.html',
  'js/service/Config'

  ],function($, _, Backbone, settingTemplate, Config){
    var settingView = Backbone.View.extend({
      el: $("#container"),
      initialize: function(){
        _.bindAll(this, "render");
      },
      render: function(){
        data = {}
        var compiledTemplate = _.template(settingTemplate, data);
        this.$el.append(compiledTemplate);
        this.delegateEvents();
        DroneConfig.getAll(function(obj){
          $('input[name=url]').val(obj.url);
          $('input[name=repo]').val(obj.repo);
          $('input[name=hostname]').val(obj.hostname);
          $('textarea[name=api_key]').val(obj.api_key);
        });
      }
    });
    return settingView;
});

这是我的测试代码:

    define(['js/view/settingView','text!templates/setting.html'], function(SettingView, texts){
  describe("Setting View", function() {
    it('render successfully', function() {
      $('body').append(__html__['app/js/test/test.html']);
      $(document).ready(function(){
        var x = new SettingView();
        x.render();
        expect($('#setting').html()).to.not.be.empty;
      });
    });
  });
});

你知道为什么会这样吗?我甚至尝试添加$(document).ready(function(){})。感谢

1 个答案:

答案 0 :(得分:3)

请记住,$('#container')是函数调用,因此您的代码与此相同:

var $el = $('#container');
var settingView = Backbone.View.extend({
  el: $el,
  //...
});

这意味着您的代码将在执行#container时查找Backbone.View.extend。显然,当发生这种情况时,没有#container元素,因此当Backbone尝试取消jQuery-ify undefined时,你最终得el elel提供了。

最简单的解决方案是将jQuery内容留给Backbone,只需使用el: '#container' 的选择器:

#container

然后Backbone会在需要构建$el时咨询DOM,到那时你应该有{{1}}。