我正在使用组件模板中的{{deferred-content}}
组件,并将其挂钩到模型对象的asset
关系中。这是我试图做的简化版本:
{{#unless showUploadForm}}
{{#deferred-content contentBlock.asset as |d|}}
{{#d.fulfilled as |asset|}}
{{#if asset.asset.isProcessing}}
{{! Show processing message here }}
{{/if}}
{{/d.fulfilled}}
{{/deferred-content}}
{{/unless}
感兴趣的是showUploadForm
计算属性:
showUploadForm: computed('contentBlock.asset', 'isReplacing', function() {
console.log(this.get('contentBlock.asset.id'));
return this.get('isReplacing') || isBlank(this.get('contentBlock.asset.id'));
})
这一切都非常适合我在开发模式和生产模式下的应用程序,所有这些都与API等有关。
然后当我尝试编写集成测试时,我们进入Trouble Town:
test('it displays processing message when asset is loaded in with processing status', function(assert) {
let deferred = RSVP.defer();
this.set('contentBlock', Ember.Object.create({
asset: deferred.promise
}));
this.render(hbs`{{asset-editor contentBlock=contentBlock}}`);
// This is likely the big fat problem. I don't know what to put here.
deferred.resolve(Ember.Object.create({
id: 'the-id',
asset: {
isProcessing: true
}
}));
let done = assert.async();
return wait().then(() => {
// Stuff I'm asserting is here. It fails because the
// `showUploadForm` computed property is returning `true`.
done();
});
});
有趣的部分是我上面分享的计算属性。在开发/制作中,我得到id
。在测试中,我得到undefined
。
我确信这个问题是因为Ember Data如何处理承诺以及它解包的对象"解析收到的数据后。问题是我不知道如何在我的集成测试中模拟它。
在调用deferred.resolve
强制应用程序将值视为模型关系时,我可以设置一些特别的内容吗?
奖励:对于咯咯笑声,我将Ember Mirage挂钩进入测试,查询store
服务以获取contentBlock
(两者都带有相关数据,然后加载以后没有),并在测试上下文中将其设置为contentBlock
。我得到了类似的结果。
答案 0 :(得分:0)
我最终使用验收测试而不是集成测试。这对我来说不是很好,因为组件测试看起来不完整,因为我无法测试该环境中的大部分功能。
也就是说,这个问题也让我难以考虑将组件分解成更小的组件,因此可以更容易地隔离和测试某些专用逻辑。然后我可以测试各个组件的功能,而不必担心数据的加载方式(通过关系直接与异步等)。
验收测试确实允许我测试所有这些小组件的整体集成,所以在将所有这些组件进一步打破之后,将有很好的事情。