2017-06-26 1 views
0

は私がサービスFoo(例えばapp/services/foo.js)を持っているコンポーネントの統合テストに注入されていません私はこのサービスを使用するコンポーネント(例えば、app/components/my-component.js)を持っています(イニシャライザのすべてのコンポーネントに既に注入されているため、手動で注入しません):サービスは

0このテストを実行する場合、それはエラーをスロー

import { test, moduleForComponent } from 'ember-qunit'; 
import hbs from 'htmlbars-inline-precompile'; 
import sinon from 'sinon'; 

const fooStub = Ember.Service.extend({ 
    myMethod() { 
    return true; 
    } 
}); 

moduleForComponent('my-component', 'Integration | Component | my-component', { 
    integration: true, 

    beforeEach() { 
    this.register('service:foo', fooStub); 
    // Calling inject puts the service instance in the context of the test, 
    // making it accessible as "foo" within each test 
    this.inject.service('foo', { as: 'foo' }); 
    } 
}); 

test('it does something', function (assert) { 
    this.render(hbs`{{my-component}}`); 
    const spy = sinon.spy(this.get('foo'), 'myMethod'); 

    const $someElement = this.$().find('.some-element-within-my-component'); 
    // This element triggers `doSomething` action inside the component 
    $someElement.click(); 

    assert.ok(spy.calledOnce, "myMethod was called within foo service"); 
}); 

TypeError: Cannot read property 'myMethod' of undefined 

サービスが注入されていないことを意味している、でも私は、注入されたと思った

import Ember from 'ember' 

const MyComponent = Ember.Component.extend({ 

    actions: 
    doSomething() { this.get('foo').myMethod(); } 

}); 

export default MyComponent; 

私は、このコンポーネントの統合テストを作成しましたスタブとして手動でテストします。

私はthis oneにぶつかるまで、Emberがイニシャライザを使用して初期化されテストされているコンポーネントに手動で注入されていないとテストにサービスを注入しない可能性があることを暗示しました。

私はコンポーネントに手動でサービスを注入しようとしましたが、テストは機能しました。しかし、これは、テストを動作させるために手動でコンポーネントにサービスを注入する必要がある場合(そしてその多くがあります)、イニシャライザの目的を完全に破棄するため、部分的な解決策に過ぎません。

これを経験したことがありましたら、間違っていることがあるのですか、または私が持っているすべてのコンポーネントに手作業でサービスを注入することなくこの作業を行うための回避策がありますか?おそらくこれでEmberにバグが記録されることになりますが、最初にstackoverflowを試して別の解決方法があるかどうかを確認したいと考えました。

答えて

1

AFAIK、イニシャライザとインスタンスイニシャライザは、acceptance-testingでのみ動作します。したがって、イニシャライザ内で行われた注入は、integration-testingのために手動で処理する必要があります。しかしながら; IMHOこれは、設計全体を変更して、コンポーネントが手動でテストをパスするようにサービスを注入する必要があるわけではありません。コンポーネントをレンダリングしている間に、作成したスタブサービスをコンポーネントに渡すのはなぜですか?私は次のことを意味します:

this.render(hbs`{{my-component foo=foo}}`); 

これは単にコンポーネントにスタブサービスを渡します。最終的には、外部からコンポーネントにサービスを渡す方法があります(integration-testingで自動的に実行されるイニシャライザを使用するか、テンプレートを使用して)。これは理想的なソリューションではありません。しかし、それはあなたが望むようにあなたのコードを保つのに十分です。

+0

チャームのように動作します。ありがとう!ちなみに、イニシャライザとインスタンスイニシャライザが受け入れテストでのみ実行されることが文書化されているところを教えてください。ありがとう。 –

+0

Emberでのテストに関するドキュメントは適切ではなく、私がイニシャライザについて書いたものは正しくないはずです。私は自分の記憶を信じて過去の経験に応じて書きました:)))しかし、私は確信しています。彼らは統合テストで実行されません:))) – alptugd

+0

彼らは確かに実行されません、そうでなければ、これは動作しています。まあ、私はEmberにこのことを知らせるべきだと思います。なぜなら、これを実行しようとする人にとっては本当に混乱しているからです。とにかく助けてくれてありがとう。 –