Jasminejs-spies
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()の機能を模倣しています。
上記のコードは以下の出力を生成します。