如何测试具有关系依赖关系的Ember模型的计算属性
How to test an Ember model's computed property that has relations dependencies?
我正在编写Qunit测试来测试一个Ember模型,但是很难测试具有关系依赖的计算属性(计算属性触发另一个模型的计算属性)。
正在测试的模型(CoffeeScript):
Customer = DS.Model.extend
firstName: DS.attr('string')
lastName: DS.attr('string')
phones: DS.attr('embedded-list')
phone: (->
@get('phones.firstObject.number')
).property('phones.firstObject.number')
fullName: (->
[@get('lastName'), @get('firstName')].join(' ') )
).property('firstName','lastName')
会议模型:
Meeting = DS.Model.extend
customers: DS.hasMany('customer')
startAt: DS.attr('isodate')
status: DS.attr()
objective: DS.attr()
customerPhones: (->
phones = []
@get('customers').forEach (c) ->
c.get('phones').forEach (ph) ->
phones.push(ph.number)
phones
).property('customers.@each.phones')
firstCustomer: (->
@get('customers.firstObject')
).property('customers.firstObject')
firstCustomerFullName: (->
@get('firstCustomer.fullName')
).property('firstCustomer.fullName')
现在,测试customerPhones
和firstCustomerFullName
让我非常困难…
我的测试如下:
`import { test, moduleForModel } from 'ember-qunit';`
moduleForModel('meeting', 'App.Meeting',{
needs: ['model:customer']
setup: ->
Ember.run do (t = @)->
->
customer = t.store().createRecord 'customer', firstName: 'John', lastName: 'Smith', phones:[]
customer.get('phones').addObject(Ember.Object.create({tag: 'home', number: '111222333'}))
customer.get('phones').addObject(Ember.Object.create({tag: 'work', number: '444555666'}))
t.subject().set('customers.content', Ember.ArrayProxy.create({content: []}));
t.subject().get('customers.content').pushObject(customer)
teardown: ->
},(container, context) ->
container.register 'store:main', DS.Store
container.register 'adapter:application', DS.FixtureAdapter
context.__setup_properties__.store = -> container.lookup('store:main')
)
test "it's a DS.Model", -> ok(@subject())
test "attributes: can be created with valid values", ->
meeting = @subject({objective: 'Follow up'})
Ember.run ->
equal(meeting.get('objective', 'Follow up'))
test "properties: firstCustomer & firstCustomerFullName & firstCustomerPhone", ->
meeting = @subject()
Ember.run ->
equal(meeting.get('firstCustomer.fullName'), 'Smith John')
equal(meeting.get('firstCustomer.phone'), '111222333')
现在,我在这个测试中使用了一些技巧,我在这里的Stack Overflow的答案中找到了,但我现在似乎找不到它了。
几天前工作得很好,现在(我知道这似乎是无稽之谈)每当我运行测试时,它都会出错:
断言失败:你不能添加'meeting'记录到这个关系(只允许'meeting')
我不知道错误在哪里,也不知道如何修复它。一整天都在瞎折腾,没有结果。
如何解决这个问题?
好了,到目前为止,我已经有了太多的评论,所以我要做一个WIP回答。
-
我删除了大部分的运行循环,它们只对异步进程是必要的。
-
我改变了你的一些计算属性为
computed.alias
属性
。
phone: (->
@get('phones.firstObject.number')
).property('phones.firstObject.number')
phone: Ember.computed.alias('phones.firstObject.number')
- 我撕掉了大部分的设置,Ember Data急切地自己加载商店,并将使用fixture id等而不指定它。(这部分可以放回去,只是在这种情况下没有必要)。
。
},(container, context) ->
container.register 'store:main', DS.Store
container.register 'adapter:application', DS.FixtureAdapter
context.__setup_properties__.store = -> container.lookup('store:main')
- 我提前道歉,我不是coffeescript的粉丝,所以我把它都放在js中。现在的问题是,如果你仍然看到任何问题,我们可能需要找出你正在使用的烬,ED和烬Qunit的版本。
我发现这个问题寻找'如何单元测试一个使用hasMany的计算属性'。
下面是我如何做的一个简单的例子(感谢Kitler):
冰箱模型:foods: DS.hasMany('food', {async: true}),
inDateFoods: Ember.computed('foods.@each.{ignoreEndDate,endDate}', function() {
let foods = this.get('foods');
let now = moment();
return foods.filter(f => f.get(ignoreEndDate) || moment(c.get('endDate')).isAfter(now));
})
假设我们现在想在单元测试中测试inDateFoods ?然后在你的冰箱模型测试文件中这样做:
import Ember from 'ember';
import { moduleForModel, test } from 'ember-qunit';
import Fridge from '../../../models/fridge';
Fridge.reopen({
foods: Ember.computed(() => [])
});
moduleForModel('fridge', 'Unit | Model | fridge', {
// Specify the other units that are required for this test.
needs: ['model:food']
});
test('filters correctly', function(assert) {
assert.expect(1);
let model = this.subject();
model.pushObject(Ember.Object.create({foods: [{id: 1, ignoreEndDate: false, endDate: '2050-03-08T00:00:00'});
assert.equal(model.get('inDateFoods.length'), 1);
});
他们这里的关键是重新打开你的模型,以删除有许多,并在做this.subject
后推动对象。在重新打开之前,我们得到了错误All elements of a hasMany relationship must be instances of DS.Model, you passed [[object Object]] error
.
- Ember数据一对多关系不起作用
- Ember.js Ember数据呈现双嵌套hasMany关系
- Ember.js将多对多关系保存到服务器
- 创建具有belongsTo关系错误的记录-Ember.js
- Ember.js:如何表示一个有多个模型的关系
- 学习Ember.js-在多对多关系中的持久性
- Ember js - 更新其他表后,有许多关系中断
- Ember.js RESTful 模型关系
- 从另一个具有属于关系的模型访问模型属性 Ember.js
- 在 Ember 中保存预订时更新具有关系的现有事件
- Ember.js:如何解析 Ember.Route 中的异步关系
- Ember&RSVP:如何解决路由中的嵌套关系's模型函数
- Ember数据-类型错误:对象没有方法'每个关系'
- Ember数据:带有初始异步关系值的createObject
- 异步关系上的Ember数据计算属性
- 为什么获胜'这个基本的一对一关系在Ember.js中起作用
- 如何在Ember.js中保存具有多对多关系的模型
- Ember排序有许多关系
- Ember关系和mongo关系
- 序列化关系ember-data