3

使用这个:

DEBUG: -------------------------------
DEBUG: Ember      : 1.5.1
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery     : 1.10.2
DEBUG: -------------------------------

并使用 Ember-qunit 进行测试。

所以我正在尝试为我的模型上的计算属性编写单元测试。计算属性取决于 hasMany 关系中的数据。

所以我的模型看起来像这样:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  roles: DS.hasMany('role'),

  isInstructor: function(){
    return this.hasRole('instructor');
  }.property('roles'),

  hasRole: function(role_name){
    var roles = this.get('roles');
    if(!Ember.isEmpty(roles)){
      return roles.any(function(role){
        return role.get('name') === role_name;
      });
    }
    return false;
  }
});

我的测试看起来像这样:

moduleForModel('user', 'Course Model', {
  needs: ['model:role']
});

test('isInstructor - user is an Instructor', function() {
  var user = this.subject({
    id: 1,
    name: 'Joe'
  });

  Ember.run(function(){
    user.set('roles.content', Ember.ArrayProxy.create({content: []}));
    var role = Ember.ObjectProxy.create({name: 'instructor'});
    user.get('roles.content').pushObject(role);
  });

  var value = user.get('isInstructor');
  equal(value, true, "expected true but was " + value);
});

当我尝试 pushObject 时,出现此错误:

Uncaught TypeError: undefined is not a function ember-data.prod.js?body=1:4284

它引用的 ember-data 中的行是这样的:

var inverse = childType.inverseFor(this.firstRecordName);

现在我尝试了一些不同的事情,但仍然没有运气。

首先,我尝试一次创建它:

var user = this.subject({
  id: 1,
  name: 'Joe',
  roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor' })]})
});

但这不起作用,因为它说:

Uncaught Error: Cannot set read-only property "roles" on object: <App.User:ember792:1>

所以我稍后尝试在 Ember.run 循环中设置角色:

user.set('roles',
  Ember.ArrayProxy.create({
    content: [
      Ember.ObjectProxy.create({
        name: 'instructor'
      })
    ]
  })
);

这给出了相同的只读错误。

所以我尝试在设置角色的同时设置内容:

user.set('roles.content',
  Ember.ArrayProxy.create({
    content: [
      Ember.Object.create({
        name: 'instructor'
      })
    ]
  })
);

我得到了

Uncaught TypeError: undefined is not a function

所以现在我是我上面定义的代码:

user.set('roles.content', Ember.ArrayProxy.create({content: []}));
var role = Ember.ObjectProxy.create({name: 'instructor'});
user.get('roles.content').pushObject(role);

并得到 TypeError。我不知所措。我不确定我做错了什么或者是否有错误。

比我聪明的人有建议吗?

这是一个 jsbin http://jsbin.com/bidus/1/

谢谢!

** 更新 1 **

查看kingpin2k在他的回答中所说的内容,我在我的应用程序中查看了我的 ember 源。我正在使用 ruby​​gem ember-source,所以我与@kingpin2k 使用的“调​​试”版本非常接近。ember-source 版本中有一些额外的功能,但所有的测试助手仍然存在。

所以我开始查看我的代码。弹出的错误与反向关系有关。

var inverse = childType.inverseFor(this.firstRecordName);

看着我的 jsbin,我没有补充说角色模型有一个belongsTo('user')

这是一个失败的 jsbin http://jsbin.com/bidus/2/使用 @kingpin2k 使用的相同 ember 源。由于角色模型上的 belongsTo 关系,它失败了。我意识到不应该在那里,因为我不需要需要了解用户的角色。因此,我删除了这种关系,现在一切都是绿色的。

现在我有一个传递的 jsbin http://jsbin.com/bidus/3/与@kingpin2k 所做的相同。

但它仍然引出了一个问题,即为什么 belongsTo 让它变得糟糕。据我所知,在那里应该没问题。也许@kingpin2k 你可以对此有所了解?我不应该为模型角色添加逆向,因为 ember 应该能够自己解决这个问题(我确实尝试添加它来踢球和咯咯笑,但代码仍然很糟糕)。我倾向于认为 ember-data 源中存在错误。

4

1 回答 1

3

Honestly I think the main issue I see is that you're using a production version of ember, and that doesn't include the testing helpers, or the method setupForTesting.

Debug version of Ember

http://jsbin.com/tuvoleqo/1/edit

Cleaner version

test('isInstructor - user is an Instructor', function() {
  var user = this.subject({
    id: 1,
    name: 'Joe'
  });

  Ember.run(function(){
    user.get('roles').pushObject(Em.Object.create({name:'instructor'}));
  });

  var value = user.get('isInstructor');
  equal(value, true, "expected true but was " + value);
});

http://jsbin.com/tuvoleqo/2/edit

于 2014-05-22T05:30:01.883 回答