我正在构建一个相对直接的comment-list
组件。我想传递可评论的模型(比如Post
)并让组件负责创建,编辑和删除注释。现在我传递了各种各样的动作,而且它非常脆弱。
如何在组件集成测试中创建Ember Data模型的真实实例?
我的直接想法是导入模型,然后导入.create({})
,但错误导致use this.store.createRecord() instead
/* jshint expr:true */
import { assert } from 'chai';
import { describeComponent, it } from 'ember-mocha';
import hbs from 'htmlbars-inline-precompile';
import Post from 'ownersup-client/post/model';
describeComponent( 'comment-list', 'Integration: CommentListComponent', {
integration: true
},
function() {
it('renders all of the comments', function() {
const model = Post.create({ title: 'title' });
model.get('comments').createRecord({ body: 'One Comment' })
this.render(hbs`{{comment-list model=model}}`);
assert.lengthOf(this.$('.comment-list-item'), 1);
});
}
);
有人有任何想法吗?
答案 0 :(得分:7)
在所有Ember测试助手中,商店仅可从moduleForModel
获得。
以下是此测试助手的工作方式(source):
var container = this.container;
var store = container.lookup('service:store') || container.lookup('store:main');
你可以在测试中做同样的事情。您也可以将它放入帮助程序中,这样就不必复制粘贴了很多东西。
请注意,它仅适用于集成测试。您可以使用与Ember CLI样板捆绑在一起的startApp
测试助手启动应用程序,将任何测试转换为集成测试。
答案 1 :(得分:5)
新的ember mocha版本0.8.4包含一种新的公共方式来注入商店等服务。很快就会有一个指南部分(见https://github.com/emberjs/guides/blob/master/source/testing/testing-components.md)
基本上,在您的beforeEach中,您需要添加以下行:this.inject.service('store');
,使商店在您的测试中可以this.get('store')
访问。
以下是新更改的提取请求的链接:https://github.com/switchfly/ember-test-helpers/pull/105
答案 2 :(得分:2)
针对在集成测试中与注入相关的类似问题而苦恼的人们的一般答案。
一切取决于项目中使用的版本和解决方案。
使用module
进行集成测试时
(import { module } from 'ember-qunit';
)
您可以在测试中使用this.owner.lookup('service:store')
有关更多信息,Dockyard上有一篇很棒的文章 https://dockyard.com/blog/2018/01/11/modern-ember-testing