Ember集成测试+模拟模型与关系+ ember -deferred-content附加组件

时间:2017-03-19 21:15:53

标签: ember.js ember-data ember-qunit

我正在使用组件模板中的{{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。我得到了类似的结果。

1 个答案:

答案 0 :(得分:0)

我最终使用验收测试而不是集成测试。这对我来说不是很好,因为组件测试看起来不完整,因为我无法测试该环境中的大部分功能。

也就是说,这个问题也让我难以考虑将组件分解成更小的组件,因此可以更容易地隔离和测试某些专用逻辑。然后我可以测试各个组件的功能,而不必担心数据的加载方式(通过关系直接与异步等)。

验收测试确实允许我测试所有这些小组件的整体集成,所以在将所有这些组件进一步打破之后,将有很好的事情。