使用这个:
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,我查看了应用程序中的 Ember 源。我正在使用rubygem 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成为了barf。据我所知,在那里可以很好。也许@ kingpin2k您可以对此进一步说明?我不应该在模型角色中添加反函数,因为ember可以自己弄清楚这一点(我确实尝试将其添加为踢和傻笑,但代码仍然很困难)。我倾向于认为ember数据源中存在错误。
最佳答案
老实说,我认为我看到的主要问题是您使用的是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