Ember组件集成测试中模型实例的使用问题
在Ember v2.9集成测试中为组件注入Ember Data模型
嘿,我刚好对Ember 2.x的测试流程熟得很,给你捋捋怎么解决这个问题~在Ember 2.9的集成测试里,你完全可以获取到应用的store服务,把模拟数据转换成真实的Ember Data模型,这样组件就能正常使用那些计算属性和定制逻辑了。
下面是具体的步骤和示例:
1. 在测试中获取Store服务
在集成测试的上下文里,你可以通过this.container.lookup('service:store')拿到store(Ember 2.9还没像新版本那样直接把store注入到测试上下文,所以用lookup是最稳妥的方式)。
2. 将模拟数据转换为Ember Data模型
根据你的需求,有两种常用方式:
方式一:推送已存在的记录(适合模拟从后端加载的数据)
如果你的模拟数据是对应已持久化的记录,用store.push()方法把数据推进store,它会自动转换成对应的模型实例:
test('组件使用Ember Data模型正常渲染', function(assert) { // 你的模拟数据 const mockData = { id: 1, title: '测试文章', body: '这是测试内容', // 包含计算属性依赖的字段 likesCount: 10 }; // 获取store const store = this.container.lookup('service:store'); // 推送数据生成模型 const postModel = store.push({ data: { type: 'post', // 这里要对应你的model名称(比如app/models/post.js就写'post') id: mockData.id, attributes: mockData } }); // 把模型传给组件 this.render(hbs`{{article-card model=postModel}}`); // 断言计算属性是否正常工作(比如你的计算属性是displayLikes) assert.equal(this.$('.likes-display').text().trim(), postModel.get('displayLikes'), '计算属性渲染正确'); });
方式二:创建新记录(适合模拟未保存的表单场景)
如果需要模拟新建的未保存记录,用store.createRecord():
const postModel = store.createRecord('post', mockData);
这种方式生成的模型会带有isNew状态,适合测试组件处理未保存数据的逻辑。
3. 注意事项
- 确保你的model类已经正确定义了所有计算属性和关联关系,否则测试里的模型实例会缺少这些逻辑
- 如果模拟数据包含关联关系(比如
belongsTo或hasMany),需要在push的参数里添加relationships字段,比如:store.push({ data: { type: 'post', id: 1, attributes: mockData, relationships: { author: { data: { type: 'user', id: 2 } } } } }); - 为了避免测试间的脏数据干扰,可以在每个测试前调用
store.unloadAll()清空store
内容的提问来源于stack exchange,提问作者kallenboone
相关产品推荐
相关产品推荐

