1

シナリオ: 実際のサービスを使用してコンポーネント A を統合テストしたいと考えていますmy-service。すべてのコンポーネントにサービスをグローバルに注入する初期化子があります: application.inject('component', 'myService', 'service:my-service');. コンポーネント A はそのテンプレートでコンポーネント B を使用myServiceし、両方ともテンプレートで使用します。

グローバル インジェクションを再作成するにはどうすればよいですか? 完全なアプリケーションはありません。必要なパラメーターがないため、実際のイニシャライザーをインポートして実行することはできません。this.inject.serviceグローバルアプリケーションコンテキストではなく、テストコンテキストに挿入するため、機能しません。

すべてのコンポーネントのテンプレートを変更して、サービスをずっと下にチェーンすることができます: {{b-component myService=myService}}、そして

this.render(hbs`{{a-component myService=myService}}`);

しかし、それは最後の手段です。また、グローバル インジェクションを取り除き、すべてのコンポーネントに手動でインジェクトすることもできます。それも最終手段です。

この問題の話をhttps://github.com/emberjs/ember.js/issues/12277まで追跡しました。それはほぼ実装されましたが、Grand Testing Unification https://github.com/emberjs/rfcs/pull/119を支持して閉鎖されました。グランドテストの統一を待っている間に解決策はありますか?

4

1 に答える 1

2

https://stackoverflow.com/users/1157494/robert-jacksonからのヒントにより、不足している部分を見つけることができました。テストコンテキストで所有者を検索できます。これは、初期化子にフィードする必要がある欠落しているパラメーターです。

import { initialize } from 'my-app/initializers/my-initializer';

// ...

beforeEach() {
  initialize(Ember.getOwner(this));
}

これで、すべてのコンポーネントに必要なグローバル インジェクションができました。

于 2017-01-10T21:27:54.693 に答える