Jasminejs-quick-guide
JasmineJS-環境設定
この章では、JasmineベースのBDDテストアプリケーションをセットアップする方法の段階的な手順について説明します。
- ステップ1 *-ジャスミンの公式ウェブサイトhttps://jasmine.github.io/にアクセスします
- ステップ2 *-バージョンリンクのいずれかをクリックします。 「エッジ」である最新バージョンを使用することをお勧めします。 選択したバージョンのホームページにリダイレクトされます。
- ステップ3 *-ホームページの[ダウンロード]セクションに移動し、スタンドアロンリリースページをクリックします。
- ステップ4 *-githubリリースページにリダイレクトされたら、そこからZipファイルをダウンロードします。
- ステップ5 *-ダウンロードしたjasmine-standalone-2.4.1フォルダーを解凍します。 次のフォルダー構造が表示されます。
- ステップ6 *-お気に入りのIDEでWebアプリケーションプロジェクトを作成し、このダウンロードしたライブラリファイルをアプリケーションに追加します。 ここでは、netbeans IDEを使用しました。 以下は、Jasmineフレームワークを追加した後のアプリケーションのディレクトリ構造です。
環境のセットアップが完了しました。 これで、アプリケーションはJasmineフレームワークでテストする準備ができました。 Jasminejs-writing-text-and-execution
JasmineJS-BDDアーキテクチャ
ジャスミンは、行動駆動開発(BDD)フレームワークに従います。 ジャスミンの動作原理を学ぶ前に、BDDフレームワークとは何かを教えてください。
次のフローチャートは、BDDフレームワークのさまざまなフェーズを示しています。
ステップ1-開始
このフェーズでは、Jasmineアプリケーションの環境を準備します。
ステップ2-失敗したテストを書く
このステップでは、初めてのテストケースを作成します。 テストするファイルや関数がないため、このテストが失敗することは明らかです。
ステップ3-コードを記述してパスする
このフェーズでは、テストする必要があるJavaScriptファイルまたは関数を準備します。 初期段階で準備したすべてのテストケースが成功することを確認する必要があるため、このフェーズは重要です。
ステップ4-リファクタリング
リファクタリングは、BDDモデルの非常に重要なフェーズであり、特定のアプリケーションまたは機能のためにできるだけ多くのテストケースを準備する必要があります。
- ステップ5-停止 *
すべてが順調に進んでいる場合は、アプリケーションの準備が整っていなければなりません。 したがって、このステップはBDDアプリケーションの終了と見なすことができます。
例
これで、BDDフレームワークの動作原理に関するいくつかの知識を集めました。 JavaScriptテストの行で、JasmineがこのBDDフレームワークをどのように追跡するかを見てみましょう。
スクリーンショットが示すように、Jasmineフレームワークを使用してAbc.jsをテストする必要があります。* SpecRunnerl は、 Spec.js(テストケースファイル)、Abc.js(テストするファイル)*、LIBを入力として取り、スペックファイルに存在するすべてのテストケースを実行して結果をレンダリングする出力ファイルです。ブラウザに。
*Lib* -これらは組み込みのJavaScriptファイルで、プロジェクトで使用されるさまざまな機能やその他のJavaScriptファイルをテストするのに役立ちます。
Spec.js(テストケースファイル)*-これは、JavaScript関数またはJavaScriptファイルをテストするために必要なすべてのテストケースを含むJavaScriptファイルです。 BDD方法論では、最初にテストを記述します。したがって、これは最初に更新する必要があるファイルです。 プロジェクトにテスト可能なファイルや関数が存在しないため、間違いなく失敗します。 このファイルは、すべての機能がテストされるまで、無制限にリファクタリングできます。
Abc.js(テストするファイル)*-これは、Spec.jsおよびLibファイルを使用して単体テストされる機能を含むファイルです。
*SpecRunnerl* -SpecRunnerlは通常のhtmlファイルであり、埋め込まれたJavaScriptコードを使用して単体テストの出力をレンダリングします。
Jasminejs-building-blocks-of-test
JasmineJS-マッチャー
Jasmineはテストフレームワークであるため、JavaScriptファイルまたは関数の結果と期待される結果を常に比較することを目的としています。 マッチャーは、Jasmineフレームワークでも同様に機能します。
*Matchers* は、実際の出力と期待される出力の間でブール比較を行うJavaScript関数です。 マッチャーには* Inbuiltマッチャー*と* Customマッチャー*の2種類があります。
内蔵マッチャー
Jasmineフレームワークに組み込まれているマッチャーは、 inbuilt matcher と呼ばれます。 ユーザーは*暗黙的に*簡単に使用できます。
次の例は、JasmineフレームワークでのInbuilt Matcherの動作を示しています。 前の章ですでにいくつかのマッチャーを使用しています。
describe("Adding single number ", function () {
//example of toEqual() matcher
it("should add numbers",function() {
expect(nested.add(5)).toEqual(5);
expect(nested.add(5)).toEqual(10);
});
it("should add numbers",function() {
expect(nested.addAny(1,2,3)).toEqual(6);
});
}
この例のtoEqual()は、* add()メソッドと addAny()メソッドの結果を toEqual()*マッチャーに渡された引数と比較する組み込みマッチャーです。
カスタムマッチャー
Jasmineの組み込みシステムライブラリに存在しないマッチャーは、カスタムマッチャー*と呼ばれます。 カスタムマッチャーは explicitly()*で定義する必要があります。 次の例では、カスタムマッチャーの動作を確認します。
describe('This custom matcher example', function() {
beforeEach(function() {
//We should add custom matched in beforeEach() function.
jasmine.addMatchers ({
validateAge: function() {
Return {
compare: function(actual,expected) {
var result = {};
result.pass = (actual > = 13 && actual < = 19);
result.message = 'sorry u are not a teen ';
return result;
}
};
}
});
});
it('Lets see whether u are teen or not', function() {
var myAge = 14;
expect(myAge).validateAge();
});
it('Lets see whether u are teen or not ', function() {
var yourAge = 18;
expect(yourAge).validateAge();
});
});
上記の例では、* validateAge()は、ある範囲で年齢を実際に検証するマッチャーとして機能します。 この例では、validateAge()はカスタムマッチャーとして機能します。 このJSファイルを *SpecRunnerl に追加して、同じように実行します。 次の出力が生成されます。
JasmineJS-ブロックをスキップ
Jasmineでは、開発者が1つまたは複数のテストケースをスキップすることもできます。 これらの手法は、仕様レベル*または*スイートレベル*で適用できます。 アプリケーションのレベルに応じて、このブロックはそれぞれ *Skipping Spec および Skipping Suite として呼び出すことができます。
次の例では、“ x” *文字を使用して特定の *Spec または Suite をスキップする方法を学習します。
仕様をスキップ
*it* ステートメントの直前に*“ x” *を使用して前の例を変更します。
describe('This custom matcher example ', function() {
beforeEach(function() {
//We should add custom matched in beforeEach() function.
jasmine.addMatchers({
validateAge: function() {
return {
compare: function(actual,expected) {
var result = {};
result.pass = (actual > = 13 && actual < = 19);
result.message = 'sorry u are not a teen ';
return result;
}
};
}
});
});
it('Lets see whether u are teen or not', function() {
var myAge = 14;
expect(myAge).validateAge();
});
xit('Lets see whether u are teen or not ', function() {
//Skipping this Spec
var yourAge = 18;
});
});
このJavaScriptコードを実行すると、結果としてブラウザーで次の出力を受け取ります。 ジャスミン自体は、特定の it ブロックが*“ xit” *を使用して一時的に*無効*になっていることをユーザーに通知します。
スキップスイート
同様に、 Skipping Suite のテクニックを実装するために、describeブロックを無効にすることができます。 次の例では、スイートブロックをスキップするプロセスについて学習します。
xdescribe('This custom matcher example ', function() {
//Skipping the entire describe block
beforeEach(function() {
//We should add custom matched in beforeEach() function.
jasmine.addMatchers({
validateAge: function() {
return {
compare: function(actual,expected) {
var result = {};
result.pass = (actual >=13 && actual<=19);
result.message ='sorry u are not a teen ';
return result;
}
};
}
});
});
it('Lets see whether u are teen or not', function() {
var myAge = 14;
expect(myAge).validateAge();
});
it('Lets see whether u are teen or not ', function() {
var yourAge = 18;
expect(yourAge).validateAge();
});
});
上記のコードは、出力として次のスクリーンショットを生成します。
メッセージバーで確認できるように、保留状態の2つの仕様ブロックが表示されます。つまり、これらの2つの仕様ブロックは*“ x” *文字を使用して無効になっています。 次の章では、さまざまな種類のジャスミンテストシナリオについて説明します。
JasmineJS-平等チェック
Jasmineは、JavaScript関数とJavaScriptファイルの同等性をチェックするのに役立つ多くのメソッドを提供します。 以下は、等価条件を確認するためのいくつかの例です。
ToEqual()
- ToEqual()*は、ジャスミンの組み込みライブラリに存在する最も単純なマッチャーです。 このメソッドの引数として指定された操作の結果が、その結果と一致するかどうかだけに一致します。
次の例は、このマッチャーがどのように機能するかを理解するのに役立ちます。 “ expectexam.js” *という名前のテスト対象ファイルが2つあり、テストする必要があるもう1つのファイルは“ expectSpec.js” *です。
Expectexam.js
window.expectexam = {
currentVal: 0,
};
ExpectSpec.js
describe("Different Methods of Expect Block",function () {
it("The Example of toEqual() method",function () {
//this will check whether the value of the variable
//currentVal is equal to 0 or not.
expect(expectexam.currentVal).toEqual(0);
});
});
正常に実行されると、これらのコードは次の出力を生成します。 前の例で説明したように、これらのファイルを specRunnerl ファイルのヘッダーセクションに追加する必要があることに注意してください。
not.toEqual()
- not.toEqual()*は、toEqual()とまったく反対に機能します。 * not.toEqual()*は、値が関数の出力と一致しないかどうかを確認する必要がある場合に使用されます。
上記の例を変更して、これがどのように機能するかを示します。
ExpectSpec.js
describe("Different Methods of Expect Block",function () {
it("The Example of toEqual() method",function () {
expect(expectexam.currentVal).toEqual(0);
});
it("The Example of not.toEqual() method",function () {
//negation testing expect(expectexam.currentVal).not.toEqual(5);
});
});
Expectexam.js
window.expectexam = {
currentVal: 0,
};
2番目のexpectブロックでは、currentValの値がゼロであるため、 currentVal の値が5に等しいかどうかを確認しています。したがって、テストに合格し、緑色の出力が提供されます。
することが()
- toBe()マッチャーはtoEqual()と同様に機能しますが、技術的には互いに異なります。 toBe()マッチャーはオブジェクトのタイプと一致しますが、 toEqual()*は結果の同値と一致します。
次の例は、toBe()マッチャーの動作原理を理解するのに役立ちます。 このマッチャーはJavaScriptの「===」演算子とまったく同じですが、toEqual()はJavaScriptの「==」演算子に似ています。
ExpectSpec.js
describe("Different Methods of Expect Block",function () {
it("The Example of toBe() method",function () {
expect(expectexam.name).toBe(expectexam.name1);
});
});
Expectexam.js
window.expectexam = {
currentVal: 0,
name:"finddevguides",
name1:finddevguides
};
*expectexam* JavaScriptファイルをわずかに変更します。 2つの新しい変数、 *name* と *name1* を追加しました。 これら2つの追加された変数の違いを見つけてください-1つは文字列型で、もう1つは文字列型ではありません。
次のスクリーンショットは、赤い十字がこれらの2つの値が等しくないことを示していますが、等しいと予想されるテスト結果です。 したがって、テストは失敗します。
*name* と *name1* の両方の変数を文字列型変数にして、同じ *SpecRunnerl* をもう一度実行してみましょう。 次に、出力を確認します。 toBe()は、変数の同値性と一致するだけでなく、変数のデータ型またはオブジェクト型とも一致することを証明します。
not.toBe()
前に見たように、toBe()メソッドの否定に他なりません。 期待される結果が関数またはJavaScriptファイルの実際の出力と一致すると失敗します。
以下は、not.toBe()マッチャーの動作を理解するのに役立つ簡単な例です。
describe("Different Methods of Expect Block",function () {
it("The Example of not.toBe() method",function () {
expect(true).not.toBe(false);
});
});
ここで、ジャスミンはtrueとfalseを一致させようとします。 trueとfalseを同じにすることはできないため、このテストケースは有効であり、パススルーされます。
JasmineJS-ブールチェック
等価チェックとは別に、Jasmineはブール条件もチェックするいくつかのメソッドを提供します。 ブール条件の確認に役立つメソッドは次のとおりです。
ToBeTruthy()
このブールマッチャーは、結果がtrueまたはfalseに等しいかどうかを確認するためにJasmineで使用されます。
次の例は、toBeTruthy()関数の動作原理を理解するのに役立ちます。
ExpectSpec.js
describe("Different Methods of Expect Block",function () {
it("The Example of toBeTruthy() method",function () {
expect(expectexam.exampleoftrueFalse(5)).toBeTruthy();
});
});
Expectexam.js
window.expectexam = {
exampleoftrueFalse: function (num) {
if(num < 10)
return true;
else
return false;
},
};
10よりも小さい5番を渡しているため、このテストケースは合格し、次の出力が得られます。
10より大きい数値を渡すと、この緑のテストは赤に変わります。 2番目のスクリーンショットでは、10を超える値を渡すと、予想されるテストケースが失敗し、「偽であると予想される」という赤い出力が生成されることがわかります。
toBeFalsy()
toBeFalsy()もtoBeTruthy()メソッドと同じように機能します。 toBeTruthyは出力がtrueと一致するのに対して、出力はfalseと一致します。 次の例は、toBeFalsy()の基本的な動作原理を理解するのに役立ちます。
ExpectSpec.js
describe("Different Methods of Expect Block",function() {
it("The Example of toBeTruthy() method",function () {
expect(expectexam.exampleoftrueFalse(15)).toBeFalsy();
});
});
Expectexam.js
window.expectexam = {
exampleoftrueFalse: function (num) {
if(num < 10)
Return true;
else
return false;
},
};
上記のコードは、10を超える値を渡し、出力がfalseであると予想されるため、Jasmineテストケースに合格します。 したがって、ブラウザには、合格したことを示す緑色の記号が表示されます。
toBeTruthyメソッド Jasminejs-sequential-check
JasmineJS-ヌルチェック
Jasmineには、実際の出力がNull、定義済み、未定義のいずれであるかを確認するためのさまざまな方法が用意されています。 この章では、上記のシナリオを確認するために、さまざまなジャスミンメソッドを実装する方法を学習します。
定義します()
このマッチャーは、コード内の変数が事前定義されているかどうかを確認するために使用されます。 この例に従って customerMatcherSpec.js ファイルを変更しましょう。
currentVal = 0;
describe("Different Methods of Expect Block",function () {
it("Example of toBeDefined", function () {
expect(currentVal).toBeDefined();
});
});
上記のコードでは、toBeDefined()は変数 currentVal がシステムで定義されているかどうかを確認します。 currentValは最初は0に定義されているため、このテストに合格し、出力として緑色のスクリーンショットが生成されます。
再び上記の例では、実際に「currentVal」を定義して再実行する最初の行を削除しましょう。 その後、赤い画面が表示されます。これは、未定義の値が定義されることを期待しているため、テストが実際に失敗することを意味します。 次のスクリーンショットが出力ファイルになります。
ToBeUndefined()
このマッチャーは、変数が以前に定義されていないかどうかを確認するのに役立ちます。基本的には、以前のマッチャーであるtoBeDefinedとは反対に機能します。 次の例では、このマッチャーの使用方法を学習します。 Specファイル、つまり 次のエントリを持つ customerMatcher.js ファイル。
describe("Different Methods of Expect Block",function () {
it("Example of toBeUndefine()", function () {
var undefineValue;
expect(undefineValue).toBeUndefined();
});
});
上記のセクションでは、変数*“ undefineValue” *が実際に未定義であるかどうかを検証します。 このファイルをSpecRunnerに追加すると、出力として緑色のスクリーンショットが表示されます。これは、この値が実際には以前に定義されていないことを示しています。
ここでも、事前定義された値を使用して変数を定義し、エラーがスローされるかどうかを確認しましょう。 新しい customerMatcher.js は次のようになります。
describe("Different Methods of Expect Block",function () {
it("Example oftoBeUndefine()", function () {
var undefineValue = 0;
expect(undefineValue).toBeUndefined();
});
});
上記のコードは、“ undefineValue” *の値を“ 0” にすでに定義しており、定義されていないことを予期しているため、エラーをスローして赤いスクリーンショットを生成します。 次のスクリーンショットは、 *SpecRunnerl ファイルを実行すると生成されます。
toBeNull()
名前が示すように、この正規表現エンジンはnull値のチェックに役立ちます。 customerMatcherSpec.js ファイルを次のコードで再度変更します。
describe("Different Methods of Expect Block",function () {
var value = null;
it("Example of toBeNull()", function () {
expect(value).toBeNull();
});
});
上記のコードでは、1つの変数 "value" について言及しており、この値を明示的にnullとして言及しています。 expectブロックでは、toBeNull()マッチャーがこの値をチェックし、それに応じて結果を提供します。 以下は、SpecRunnerlファイルを使用して実行した場合の上記のコードの出力です。
次に、null以外の定義済みの値を指定してテストしてみましょう。 それに応じて customerMatcher.js ファイルを変更してください。
describe("Different Methods of Expect Block",function () {
var value = "finddevguides";
it("Example of toBeNull()", function () {
expect(value).toBeNull();
});
});
上記の例では、変数値をnull値ではない「finddevguides」で変更しています。 したがって、このテストは失敗し、出力として赤いスクリーンショットが生成されます。
JasmineJS-不平等チェック
ここまで、要件に基づいてさまざまなシナリオをテストするのに役立つJasmineのさまざまな方法について説明しました。 この章では、JSファイルの不等条件をチェックするのに役立つさまざまなマッチャーについて学習します。 以下は、この目的に使用されるマッチャーです。
ToBeGreaterThan()
名前が示すように、このマッチャーは条件よりも大きいことを確認するのに役立ちます。 次のコードを使用して customerMatcher.js を変更します。
describe("Different Methods of Expect Block",function () {
var exp = 8;
it("Example of toBeGreaterThan()", function () {
expect(exp).toBeGreaterThan(5);
});
});
上記のコードでは、変数*“ exp” *の値が5より大きいと予想しています。 変数「exp」の値は「8」であり、「5」より大きいため、このコードは緑色のスクリーンショットを生成します。
ここで、変数の値を「4」に変更し、このテストを失敗させます。 そのためには、次のコードを使用して js ファイルを変更する必要があります。
describe("Different Methods of Expect Block",function () {
var exp = 4;
it ("Example of toBeGreaterThan()", function () {
expect(exp).toBeGreaterThan(5);
});
});
値4を5より大きくすることはできないため、このコードは失敗します。 したがって、次の出力が生成されます。
ToBeLessThan()
このマッチャーは、テストシナリオの小なり条件を確認するのに役立ちます。 toBeGreaterThan()マッチャーの動作とはまったく逆に動作します。 次に、このマッチャーがどのように機能するかを見てみましょう。 それに応じて customerMatcher.js ファイルを変更しましょう。
describe("Different Methodsof Expect Block",function () {
var exp = 4;
it("Example of toBeLessThan()", function() {
expect(exp).toBeLessThan(5);
});
});
前の例と同様に、値が「4」の変数が1つあります。 このコードでは、この変数の値が5未満かどうかを確認しています。 このコードは次の出力を生成します。
これを失敗させるには、変数expにもっと大きな数字を割り当てる必要があります。 それを行って、アプリケーションをテストしましょう。 値として25を exp に割り当てると、間違いが発生し、次のスクリーンショットが赤で表示されます。
JasmineJS-番号チェックではありません
Jasmineは、* toBeNaN()*であるこの特別なタイプのテストシナリオをチェックする特別なマッチャーを提供します。
*customerMatcher.js* を次のコードで変更しましょう。
describe("Different Methods of Expect Block",function () {
it("Example of toBeNaN()", function () {
expect(0/0).toBeNaN();
});
});
ここでは、決定できない「0/0」の値をテストします。 したがって、このコードは次の緑色のスクリーンショットを生成します。
次に、次のロジックを使用してコードを再度変更します。1つの変数 exp を25に割り当て、結果が5で割った数値ではないことを想定します。
describe("Different Methods of Expect Block",function () {
var exp = 25;
it("Example of toBeNaN()", function () {
expect(exp/5).toBeNaN();
});
});
このコードは次の出力を生成します。
JasmineJS-例外チェック
さまざまな計算マッチャーとは別に、Jasmineはプログラムの例外をチェックするための便利なマッチャーをいくつか提供します。 次のコードセットを使用してJavaScriptを変更します。
var throwMeAnError = function() {
throw new Error();
};
describe("Different Methods of Expect Block", function() {
var exp = 25;
it ("Hey this will throw an Error ", function() {
expect(throwMeAnError).toThrow();
});
});
上記の例では、意図的にそのメソッドから例外をスローする1つのメソッドを作成し、expectブロックでエラーをキャッチすると予想しています。 すべてがうまくいけば、このコードは次の出力を生成します。
ここで、このテストケースが失敗するために、関数 throwMeAnError でそのthrowステートメントを省略する必要があります。 以下は、コードが要件を満たしていないため、出力として赤いスクリーンショットを生成するコードです。
var throwMeAnError = function() {
//throw new Error();
};
describe("Different Methods of Expect Block",function() {
var exp = 25;
it("Hey this will throw an Error ", function() {
expect(throwMeAnError).toThrow();
});
});
ご覧のように、メソッドが例外をスローした場所からその行をコメントしました。 以下は、SpecRunnerlが正常に実行された場合の上記のコードの出力です。
Jasmine.Any()
*Any* は、出力が不明な場合に使用される特別なマッチャーです。 次の例では、これがどのように機能するかを学習します。 *customerMatcher.js* を次のコードで変更します。
var addAny = function() {
var sum = this.currentVal;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
this.currentVal = sum;
return this.currentVal;
}
describe("Different Methods of Expect Block",function () {
it("Example of any()", function() {
expect(addAny(9,9)).toEqual(jasmine.any(Number));
});
});
ここで、引数として提供された数値の合計を提供する1つの関数を宣言しました。 expectブロックでは、結果は何でもかまいませんが、Numberである必要があります。
合計収量18の後の9と9の両方が数値であるため、このテストに合格し、次の緑色のスクリーンショットが出力として生成されます。
次に、次のコードに従ってコードを変更します。ここでは、関数* AddAny()*の出力として文字列型変数を想定しています。
var addAny = function() {
var sum = this.currentVal;
for(var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
this.currentVal = sum;
return this.currentVal;
}
describe("Different Methodsof Expect Block",function () {
it("Example of any()", function () {
expect(addAny(9,9)).toEqual(jasmine.any(String));
});
});
上記のコードの出力は次のとおりです。
JasmineJS-beforeEach()
Jasmineのもう1つの注目すべき機能は、各機能の前後です。 これらの2つの機能を使用して、各仕様の実行の前後にいくつかのコードを実行できます。 この機能は、アプリケーションで共通コードを実行するのに非常に便利です。 次のようなspecファイルを1つ作成します。
var currentVal = 0;
beforeEach(function() {
currentVal = 5;
});
describe("Different Methods of Expect Block",function() {
it("after each function ", function() {
expect(currentVal).toEqual(5);
});
});
ここでは、最初に1つの変数を「0」として宣言しましたが、このブロックの値は5に等しいはずです。 上記のコードは以下の出力を生成します。
上記のコードでは、expectブロックの実行前に、変数 currentVal に5が割り当てられます。 したがって、エラーのない緑色のスクリーンショットが生成されます。
JasmineJS-afterEach()
beforeEach()と同様に、afterEach()はまったく同じように機能します。 specブロックの実行後に実行されます。 次のコードを使用して前の例を変更しましょう。
var currentVal = 0;
afterEach(function() {
currentVal = 5;
});
describe("Different Methods of Expect Block",function() {
it("first call ", function() {
expect(currentVal).toEqual(0);
});
it("second call ", function() {
expect(currentVal).toEqual(5);
});
});
上記の例では、最初のspecブロックの実行中、 currentVal の値は0です。 したがって、テストケースに合格しますが、最初のitブロックを実行した後、Jasmine compileはafterEach()ブロックを実行しました。これにより、currentValの値が5になります。 したがって、2番目のケースも満たし、出力として緑色のスクリーンショットを生成します。
JasmineJS-スパイ
ジャスミンスパイは、その名前が示すものとまったく同じことを行う別の機能です。 これにより、アプリケーションの関数呼び出しをスパイできます。 Jasmineで利用可能なスパイテクノロジーには2つのタイプがあります。 最初の方法論は* spyOn()を使用して実装でき、2番目の方法論は createSpy()*を使用して実装できます。 この章では、これら2つの方法論について詳しく学習します。
spyOn()
spyOn()はJasmineライブラリに組み込まれているため、特定のコードをスパイできます。 新しい仕様ファイル「spyJasmineSpec.js」と、「spyJasmine.js」という名前の別の js ファイルを作成しましょう。 これら2つのファイルのエントリは次のとおりです。
SpyJasmine.js
var Person = function() {};
Person.prototype.sayHelloWorld = function(dict) {
return dict.hello() + " " + dict.world();
};
var Dictionary = function() {};
Dictionary.prototype.hello = function() {
return "hello";
};
Dictionary.prototype.world = function() {
return "world";
};
SpyJasmineSpec.js
describe("Example Of jasmine Spy using spyOn()", function() {
it('uses the dictionary to say "hello world"', function() {
var dictionary = new Dictionary;
var person = new Person;
spyOn(dictionary, "hello"); //replace hello function with a spy
spyOn(dictionary, "world"); //replace world function with another spy
person.sayHelloWorld(dictionary);
expect(dictionary.hello).toHaveBeenCalled();
//not possible without first spy
expect(dictionary.world).toHaveBeenCalled();
//not possible withoutsecond spy
});
});
上記のコードでは、personオブジェクトに「Hello world」と言うようにしたいのですが、出力リテラル「Hello world」を提供するには、personオブジェクトに辞書オブジェクトと相談する必要があります。
実際に hello および world 関数の機能を模倣するspyOn()関数を使用したことがわかるSpecファイルを見てください。 したがって、実際に関数を呼び出すのではなく、関数呼び出しを模倣しています。 それがスパイの専門です。 上記のコードは、次の出力を生成します。
createSpy()
スパイ機能を取得する別の方法は、createSpy()を使用することです。 次のコードを使用して、2つの js ファイルを変更しましょう。
SpyJasmine.js
var Person = function() {};
Person.prototype.sayHelloWorld = function(dict) {
return dict.hello() + " " + dict.world();
};
var Dictionary = function() {};
Dictionary.prototype.hello = function() {
return "hello";
};
Dictionary.prototype.world = function() {
return "world";
};
SpyJasmineSpec.js
describe("Example Of jasmine Spy using Create Spy", function() {
it("can have a spy function", function() {
var person = new Person();
person.getName11 = jasmine.createSpy("Name spy");
person.getName11();
expect(person.getName11).toHaveBeenCalled();
});
});
specファイルを見てください。 Person オブジェクトの* getName11()を呼び出しています。 この関数は *spy Jasmine.js のpersonオブジェクトには存在しませんが、エラーは発生していないため、出力は緑で正です。 この例では、createSpy()メソッドは実際にgetName11()の機能を模倣しています。
上記のコードは以下の出力を生成します。