【发布时间】:2015-09-21 18:44:25
【问题描述】:
我有一个侧边栏组件,它依赖于通过初始化程序注入的侧边栏服务。
然后组件有一个计算属性标题,它与服务上的相同属性相关联:
title: function () {
return this.get('sideBarService.title');
}.property('sideBarService.title'),
这适用于应用程序本身,但当服务更新时,我无法在集成测试中更新组件。
这是我的非工作集成测试:
import Ember from 'ember';
import startApp from '../helpers/start-app';
import hbs from 'htmlbars-inline-precompile';
import { moduleForComponent, test } from 'ember-qunit';
var application, container, sideBarService;
moduleForComponent('side-bar', 'Integration | side-bar',{
integration: true,
beforeEach: function() {
application = startApp();
container = application.__container__;
sideBarService = container.lookup('service:side-bar');
},
afterEach: function() {
Ember.run(application, 'destroy');
}
});
test('it displays the correct title', function(assert) {
assert.expect(1);
Ember.run(function () {
sideBarService.set('title', 'Hello');
});
this.render(hbs`
{{side-bar}}
`);
var content = this.$('.side-bar-content .title').text().trim();
var serviceTitle = sideBarService.get('title');
// fails
assert.deepEqual(content, serviceTitle);
});
有趣的是,如果我在测试中调试并使用控制台抓取组件,然后从组件中抓取 sideBarService,它会知道更新的标题值,甚至组件本身的值标题似乎也更新了,但是dom 永远不会更新:
//debugged in browser console
var sb = container.lookup('component:side-bar')
undefined
sb.get('title')
"Hello"
sb.get('sideBarService.title')
"Hello"
this.$('.title').text().trim()
""
这是一个运行循环问题吗?如果是这样,我需要做什么才能将其关闭?
编辑:关于托兰的评论。这看起来对吗?
var done = assert.async();
var content = this.$('.side-bar-content .title').text().trim();
var serviceTitle = sideBarService.get('title');
setTimeout(function() {
assert.deepEqual(content, serviceTitle);
done();
});
【问题讨论】:
-
通常带有异步代码我发现集成测试需要“var done = assert.async()”加上 setTimeout 为 1(然后当我执行断言并触发 done()我可以验证事件循环是否按预期完成了它的工作)。试试看,让我知道它是否有效/或者您是否需要一些帮助
-
我真诚地感谢您的回复,但没有看。我在上面添加了一个 sn-p 来显示我做了什么,以防我没有正确调用 assert async
-
@ToranBillups 我肯定会接受你的提议来深入研究这个!有没有最好的方式来跟进你?
标签: ember.js ember-qunit