Ember测试具有使用服务的帮助程序的组件

时间:2016-04-17 11:16:51

标签: testing ember.js ember-cli

说我在组件中有这个:

{{#if (has-spotify)}}
  <i class="fa fa-spotify" data-toggle="modal" data-target="#myModal"></i>
{{else}}
  <i class="fa fa-spotify" {{action "authSpotify"}}></i>
{{/if}}

has-spotify助手有这个:

import Ember from 'ember';

export function hasSpotify() {
  return this.get('spotifyService.spotifyInfo').then((result) =>{
    return result !== undefined;
  });
}

export default Ember.Helper.extend({
  spotifyService: Ember.inject.service(),
  compute: hasSpotify
});

spotifyService调用我们的API。

如何在组件测试中存根该助手?

1 个答案:

答案 0 :(得分:0)

您可以在集成测试中使用getOwnerregister来存储服务:

test('when spotify service fails', function(assert) {
  let stub = Ember.Service.extend({ spotifyInfo: undefined });

  Ember.getOwner(this).register('service:spotify-service', stub);

  this.render(hbs`{{spotify-song}}`);

  assert.equal(this.$().text().trim(), 'Log in', 'asks for log in');
});

Here's an Ember Twiddle with a simplified version of your component, helper, and service, and working integration tests

更多详情

你的帮助器返回一个promise,它总是很简单,意味着你的示例组件永远不会到达第二个分支。 Look at ember-promise-helpers解决这个问题。

为了回答您的测试问题,我已经简化了您的帮助,不使用承诺,如下所示:

import Ember from 'ember';

export function hasSpotify() {
  return this.get('spotifyService.spotifyInfo') !== undefined;
}

export default Ember.Helper.extend({
  spotifyService: Ember.inject.service(),
  compute: hasSpotify
});

这是&#34;正常&#34; Spotify服务:

import Ember from 'ember';

export default Ember.Service.extend({
  spotifyInfo: { username: 'alisdair' }
});

这是更简单的组件模板:

{{#if (has-spotify)}}
  Song info
{{else}}
  Log in
{{/if}}

快乐路径集成测试如下所示:

test('normal usage', function(assert) {
  this.render(hbs`{{spotify-song}}`);

  assert.equal(this.$().text().trim(), 'Song info', 'shows song info');
});

这是使用真实的服务和帮助,所以一切正常。

要将助手服务注入助手,您需要创建替换服务对象。然后使用Ember.getOwner以与原始服务相同的名称注册存根,并渲染您的组件:

let spotifyService = Ember.Service.extend({ spotifyInfo: undefined });

Ember.owner.register('service:spotify-service', spotifyService);

this.render(hbs`{{spotify-song}}`);

然后,您的帮助程序将注入此存根服务,您可以使用该服务将其行为更改为您想要的测试。