编程语言
首页 > 编程语言> > javascript-具有hasMany关系的模型上的Ember.js单元测试计算属性会产生TypeError

javascript-具有hasMany关系的模型上的Ember.js单元测试计算属性会产生TypeError

作者:互联网

使用这个:

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在说什么in his answer,我在应用程序中查看了余烬源.我使用的是rubygem ember-source,因此与@ kingpin2k使用的“调​​试”版本非常接近. ember-source版本中还有一些额外的功能,但是所有测试助手仍然存在.

所以我开始看我的代码.弹出的错误与逆关系有关.

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

并查看我的jsbin,我未能添加该角色模型具有belongsTo(‘user’)

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

现在我有一个传递的jsbin http://jsbin.com/bidus/3/,它与@ kingpin2k一样.

但这仍然引起了一个问题,那就是为什么belongsTo成为了barf.据我所知,在那里可以很好.也许@ kingpin2k您可以对此进一步说明?我不应该在模型角色中添加反函数,因为ember可以自己弄清楚这一点(我确实尝试将其添加为踢和傻笑,但是代码仍然是barfs).我倾向于认为ember数据源中存在错误.

解决方法:

老实说,我认为我看到的主要问题是您使用的是余烬的生产版本,并且不包括测试助手或setupForTesting方法.

调试版本的Ember

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

清洁版

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

标签:unit-testing,ember-js,ember-data,javascript,ember-qunit
来源: https://codeday.me/bug/20191121/2053816.html