は私がサービスFoo
(例えばapp/services/foo.js
)を持っているコンポーネントの統合テストに注入されていません私はこのサービスを使用するコンポーネント(例えば、app/components/my-component.js
)を持っています(イニシャライザのすべてのコンポーネントに既に注入されているため、手動で注入しません):サービスは
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を試して別の解決方法があるかどうかを確認したいと考えました。
チャームのように動作します。ありがとう!ちなみに、イニシャライザとインスタンスイニシャライザが受け入れテストでのみ実行されることが文書化されているところを教えてください。ありがとう。 –
Emberでのテストに関するドキュメントは適切ではなく、私がイニシャライザについて書いたものは正しくないはずです。私は自分の記憶を信じて過去の経験に応じて書きました:)))しかし、私は確信しています。彼らは統合テストで実行されません:))) – alptugd
彼らは確かに実行されません、そうでなければ、これは動作しています。まあ、私はEmberにこのことを知らせるべきだと思います。なぜなら、これを実行しようとする人にとっては本当に混乱しているからです。とにかく助けてくれてありがとう。 –