Backbone.js分析方法

Backbone.js Parse Method

本文关键字:方法 js Backbone      更新时间:2023-09-26

我正在尝试使用sinon.js和jasmine.js对我的第一个backbone.js应用程序进行单元测试。

在这个特定的测试用例中,我使用sinon.js fakeServer方法返回一个具有以下结构的伪响应。

beforeEach( function(){
  this.fixtures = {
    Tasks:{
      valid:{
        "tasks":[
          {
            id: 4,
            name:'Need to complete tests',
            status: 0
          },
          {
            id: 2,
            name:'Need to complete tests',
            status: 1
          },
          {
            id: 3,
            name:'Need to complete tests',
            status: 2,
          }
        ]
      }
     }
    };
  });

因此,当我在下面的测试用例中实际调用fetch调用时,它会正确地返回3个模型。在集合的解析方法中,我试图删除根"tasks"键,只返回对象数组,这在backbone.js文档中有提到。但当我这样做时,没有模型被添加到集合中,collection.length返回0。

   describe("it should make the correct request", function(){
    beforeEach( function(){
      this.server = sinon.fakeServer.create();
      this.tasks = new T.Tasks();
      this.server.respondWith('GET','/tasks', this.validResponse( this.fixtures.Tasks.valid) );
    });
    it("should add the models to the tasks collections", function(){
      this.tasks.fetch();
      this.server.respond();
      expect( this.tasks.length ).toEqual( this.fixtures.Tasks.valid.tasks.length );
    });
    afterEach(function() {
      this.server.restore();
    });
  });

任务集合

  T.Tasks = Backbone.Collection.extend({
    model: T.Task,
    url:"/tasks",
    parse: function( resp, xhr ){
      return resp["tasks"];
    }
  });

你能告诉我我在这里做错了什么吗?

我的代码的问题在于模型的验证方法,而不是集合的解析方法。我在测试这些属性,即使它们不存在。发送到验证的对象不会每次都具有所有属性。例如,在一个具有id、title和status的任务模型中,其中status默认设置为0,如果我创建一个类似的模型

var t = new Task({'title':'task title'});
t.save();

在这里,validate方法将只获取{'title':'task title'}作为validate方法的参数。

因此,在validate方法中添加这些条件也很重要,当我添加条件以检查特定属性的存在时,以及当它不是null或未定义时,我的测试开始通过。