9

Angular ディレクティブのテストをいくつか書いていますが、入力フィールドへのユーザー入力をシミュレートする必要があります。私はこれをやろうとしました:

element.find('input').val('some value').trigger('input');

しかし、うまくいきませんでした。トリガーchangeも機能しませんでした。エレメント スコープに直接アクセスしてelement.scope()変更できることはわかっていますが、入力の値を変更して Angular にデータ バインディングを行わせる方が自然なようです。

それだけの価値があるためinput(name).enter(value)、Angular ngScenario からチェックアウトしましたが、私と同じように動作するようです:

...
input.val(value);
input.trigger(event || (supportInputEvent ? 'input' : 'change'));
...

私は何が欠けていますか?この場合、ユーザー入力をテストするより良い方法はありますか?

(質問を説明するためにjsFiddlerスクリプトを作成しました)

アップデート

明確化が必要だと思います。私は DOM や Angular 領域自体の外側のスコープを変更しようとしているわけではありません。ディレクティブのスコープのプロパティにバインドされた入力ボックスをレンダリングするディレクティブがあります。ディレクティブが想定どおりに動作することを確認する自動テストを作成しています。1 つのテストで行うべきことは、入力をシミュレートして、ディレクティブ スコープが更新され、その入力に対して何らかの動作が実行されることをアサートできるようにすることです。前述したように、 を使用してテスト コードからディレクティブのスコープを変更できますがelement.scope()、入力の値を変更して Angular に任せたいと思います。

4

2 に答える 2

7

調査とテストにさらに時間を費やした後、何が問題なのかを突き止めました。jqLit​​e は使用してイベント ハンドラーを登録し、jQuery関数addEventHandlerによってトリガーされません。triggerAngular のスクリプトが jQuery のスクリプトの前にロードされていたため (したがって、jqLit​​e を使用していたため)、jsFiddle スクリプトが機能しませんでした。Angular が jQuery 関数を使用してイベント ハンドラーを登録できるように、すべてを正しい順序でロードするようにスクリプトを更新しました。これonにより、入力ボックスの変更がシミュレートされ、Angular にデータ バインディングを実行するように指示されます。

私のテスト コードはまったく同じ理由で機能しませんでした。スクリプトの順序も変更して修正しました。たまたま jQuery を使用していなかった場合は、dispatchEvent代わりに を呼び出してイベントをトリガーする必要がありましtriggerた。

于 2013-07-31T05:53:59.757 に答える