这是针对Ember 2.2.0。我想使用ember-data
使用来自我的API服务器的实时数据来测试我的组件,而不是来自测试助手的模拟数据,手动AJAX请求或来自ember-cli-mirage
之类的工具。目前我在测试中的所有内容都是这段代码:
import { moduleForComponent, test } from 'ember-qunit';
import hbs from 'htmlbars-inline-precompile';
moduleForComponent('checkbox-group', 'Integration | Component | checkbox group', {
integration: true
});
test('it renders', function(assert) {
this.render(hbs`{{checkbox-group}}`);
assert.equal(this.$().text().trim(), '');
});
我想做的是这样的事情:
test('it renders', function(assert) {
const store = getStoreFromSomewhere();
const model = store.find('data').then(() => {
this.render(hbs`{{checkbox-group data=model}}`);
// Do testing on component with model from server
});
});
问题是我不知道如何获取商店实例,另外我也不知道ember如何进行异步测试。
文档不太有用:/。有人可以让我知道如何获取商店实例,如果这不可能,另一种方法是使用ember-data
进行此测试吗?
答案 0 :(得分:4)
我相信,这更像是验收测试,而不是集成测试。验收测试设置整个应用程序,以便您可以测试它。
我相信你应该伪造模型的集成测试,例如:
test('it renders', function(assert) {
const modelValue = Ember.Object.create({
prop1: value1,
prop2: value2,
});
this.set('model', modelValue);
this.render(hbs`{{checkbox-group data=model}}`);
// Do testing on component with fake model
});
});
用那个说,我认为我要说的只有在Ember 2.2之前有效(我相信在Ember 2.3中已被弃用)。您可以执行以下操作:
let store = this.container.lookup('service:store');
但是,如果你这样做......当你使用商店时,你会收到一个错误。
"断言失败:您已打开测试模式,禁用了 run-loop的自动运行。您将需要使用异步包装任何代码 跑步中的副作用"
这意味着您需要在Ember.run中包含异步代码
Ember.run(() => {
let store = this.container.lookup('service:store');
store.findAll('post').then((posts) => {
//do stuff
});
});
我的两分钱,不会直接在集成测试中使用商店。
答案 1 :(得分:3)
在moduleForComponent
规范中,我认为这样做的方法是这样的:
var store = Ember.getOwner(this).lookup("service:store");
而不是:
var store = this.container.lookup('service:store');
并且,您可以在beforeEach
:
this.promise = new Ember.RSVP.Promise((resolve) => {
var response = anEmberObject;
resolve(response);
});
this.storeMock = Ember.Service.extend({
save: ()=>{
return this.promise;
},
reload: (query)=>{
return this.promise;
}
});
Ember.getOwner(this).register('service:store', this.storeMock);
Ember.getOwner(this).inject('component', 'store', 'service:store');