【问题标题】:ReferenceError when trying to access Backbone models from Jasmine?尝试从 Jasmine 访问主干模型时出现 ReferenceError?
【发布时间】:2013-11-01 13:04:12
【问题描述】:

我认为这只是一个 JavaScript 范围问题。

我正在尝试将一些 Jasmine 测试添加到 Backbone 应用程序,但我不知道如何从我的 Jasmine 设置中访问 Backbone 模型。

这是我当前的应用程序结构(main.js 是我的 Backbone 应用程序):

index.html
js/
  main.js
  vendor/
    backbone.js
    jquery.min.js // etc  
tests/
  SpecRunner.html
  spec/
    testSpec.js

main.js的内容是这样的,从index.html开始运行一切正常:

$(function(){
  var Todo = Backbone.Model.extend({
    defaults: function() {
      return {};
    }, 
 ... etc

SpecRunner.html 中的文件如下所示:

  <!-- include source files here... -->
  <script src="/js/vendor/jquery-1.10.2.min.js"></script>
  <script src="/js/vendor/underscore.js"></script>
  <script src="/js/vendor/backbone.js"></script>
  <script src="/js/main.js"></script>

  <!-- include spec files here... -->
  <script type="text/javascript" src="spec/testSpec.js"></script>

我已经在testSpec.js 中编写了这个测试,但是使用ReferenceError: Todo is not defined 失败了:

describe("Todo tests", function(){ 
  var todo = new Todo("Get the milk", "Tuesday"); 
  it("should be correctly defined", function(){
    expect(todo).toBeDefined();
  });
  it("should have the correct title", function(){
    expect(todo.title).toBe("Get the milk");
  });
});

如何获取 Todo 范围?我试过window.Todo,但这也无济于事。

【问题讨论】:

标签: javascript backbone.js jasmine


【解决方案1】:

正如我们在Backbone reference 看到的那样。

构造函数/初始化 new Model([attributes], [options]) 创建模型实例时,可以传入 属性,将在模型上设置。

构造函数需要用对象字面量(键值对)来初始化,如下:

new Book({
    title: "One Thousand and One Nights",
    author: "Scheherazade"
});

因此您需要将代码更改为:

var todo = new Todo({   
                 task: "Get the milk",
                 dayOfWeek: "Tuesday"
           });

更新:

在这里,您在 jquery 函数范围内声明了 Todo,并尝试从外部访问。

$(function(){
    var Todo = Backbone.Model.extend({
        defaults: function() {
          return {};
        },
        etc...
    } 
}

您有两个选择,将 Todo 声明为全局,不推荐,但主要用于主干样本:

$(function(){
    window.Todo = Backbone.Model.extend({
        defaults: function() {
          return {};
        },
        etc...
    } 
});

你也可以尝试在声明后调用jquery函数:

$(function(){
    var Todo = Backbone.Model.extend({
        defaults: function() {
          return {};
        },
        etc...
    } 
})();

【讨论】:

  • 不,还是ReferenceError: Todo is not defined。我认为应该以这种方式构造对象是对的,但目前的问题只是 Jasmine 根本看不到任何Todo。
  • 如果有帮助请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多