尝试从 Jasmine 访问主干模型时出现参考错误

ReferenceError when trying to access Backbone models from Jasmine?

本文关键字:参考 错误 模型 Jasmine 访问      更新时间:2023-09-26

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

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

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

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");
  });
});

如何获取待办事项范围?我已经尝试过window.Todo但这也没有帮助。

正如我们在主干参考中看到的那样。

构造函数/初始化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...
    } 
})();