[解決済み] Angularのクリックイベントのユニットテスト
質問
Angular2アプリにユニットテストを追加しようとしています。コンポーネントの1つで、ボタンに
(click)
ハンドラを持つボタンがあります。ユーザーがボタンをクリックすると、関数が呼び出されます。
.ts
クラスファイルで定義された関数が呼び出されます。この関数は、ボタンが押されたことを示すメッセージを console.log ウィンドウに表示します。私の現在のテストコードでは
console.log
メッセージの印刷をテストしています。
describe('Component: ComponentToBeTested', () => {
var component: ComponentToBeTested;
beforeEach(() => {
component = new ComponentToBeTested();
spyOn(console, 'log');
});
it('should call onEditButtonClick() and print console.log', () => {
component.onEditButtonClick();
expect(console.log).toHaveBeenCalledWith('Edit button has been clicked!);
});
});
しかし、これはコントローラクラスをテストするだけで、HTMLをテストするわけではありません。私は、ロギングが起こることをテストしたいだけではありません。
onEditButtonClick
が呼び出されたときにロギングが行われることをテストしたいだけではありません。
onEditButtonClick
が呼び出されることをテストしたいのです。どうすればよいでしょうか?
どのように解決するのですか?
<ブロッククオート私の目的は、ユーザーが編集ボタンをクリックしたときに 'onEditButtonClick' が呼び出されるかどうかを確認することで、 console.log が出力されることだけを確認することではありません。
まず、Angularの
TestBed
. この方法で、実際にボタンを掴んでクリックすることができます。これから行うのは、モジュールを設定することです。
@NgModule
と同じように、テスト環境用に
import { TestBed, async, ComponentFixture } from '@angular/core/testing';
describe('', () => {
let fixture: ComponentFixture<TestComponent>;
let component: TestComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ ],
declarations: [ TestComponent ],
providers: [ ]
}).compileComponents().then(() => {
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
});
}));
});
次に、スパイする必要があるのは
onEditButtonClick
メソッドをスパイし、ボタンをクリックし、そのメソッドが呼び出されたことを確認します。
it('should', async(() => {
spyOn(component, 'onEditButtonClick');
let button = fixture.debugElement.nativeElement.querySelector('button');
button.click();
fixture.whenStable().then(() => {
expect(component.onEditButtonClick).toHaveBeenCalled();
});
}));
ここでは
async
テストを実行する必要があります。
fixture.whenStable()
更新
現在では
fakeAsync/tick
コンボではなく
async/whenStable
コンボとは異なります。後者はXHRの呼び出しがある場合に使用されるべきです。
fakeAsync
はそれをサポートしないからです。ですから、上記のコードの代わりにリファクタリングすると、次のようになります。
it('should', fakeAsync(() => {
spyOn(component, 'onEditButtonClick');
let button = fixture.debugElement.nativeElement.querySelector('button');
button.click();
tick();
expect(component.onEditButtonClick).toHaveBeenCalled();
}));
を忘れずにインポートしてください。
fakeAsync
と
tick
.
こちらもご覧ください。
関連
-
[解決済み] Angular HTMLバインディング
-
[解決済み】Angular / TypeScriptのプライベートメソッドのユニットテストをJasmineで記述する方法
-
[解決済み】Angular 2 Unit Tests。名前 'describe' が見つからない
-
[解決済み] Angular2 ngSwitchステートメントでtypescriptのenum値を使用する方法
-
[解決済み] AngularでEventEmitterに2つのパラメータを渡すには?
-
[解決済み] angular4 / typescriptでdocument.getElementByIdの置き換え?
-
[解決済み] angular-cli が HTTPS で ng serve するようにする。
-
[解決済み] 角度の2つのスイッチケース値
-
[解決済み] コンストラクタ注入を行わずにサービスのインスタンスを取得する
-
[解決済み] 64進数の文字列を角(2+)でエンコードおよびデコードする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 角度2 ngfor 最初、最後、インデックスループ
-
[解決済み] angular-cliのパラメータ --base-href と --deploy-url の違いは何ですか?
-
[解決済み] .tsファイルはTypeScriptのコンパイルの一部ですが、使用されていませんという警告を消すには?
-
[解決済み] プロパティ 'X' はプライベートであり、クラス 'xyzComponent' 内でのみアクセス可能です。
-
[解決済み] angular4 / typescriptでdocument.getElementByIdの置き換え?
-
[解決済み] 文字列|ヌル'型の引数は、文字列'型のパラメータに代入できません。タイプ 'null' はタイプ 'string' に割り当てられません。
-
[解決済み] 新しいangularプロジェクトを作成する際に依存関係ツリーエラーを解決できない
-
[解決済み] angular keyvalue pipe sort properties / iterate in order (アンギュラーキーバリューパイプソートプロパティ / イテレートオーダー)
-
[解決済み] 角度換算2
-
[解決済み] Angular6でパスワードの検証を確認する [重複]。