私はJasmineを使用していて、以下のように、オブジェクトに特定のメソッドがあるかどうかをテストしたいと思います。
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
どうすればテストできますか?ご親切にありがとうございます。
組み込みの方法はありませんが、これを行うことで目的の結果を得ることができます。
it "should have 'open' method", ->
@xhr = ajax.create()
expect(typeof @xhr.open).toBe("function")
他の回答で提案されているように定義されているかどうかをテストすると、合格するはずのEdgeケースがいくつかあることに注意してください。次のような構造をとれば合格し、間違いなく機能しません。
{ open : 1 }
@davidが正しく答えました。 toBeDefined()
はおそらくあなたが望むものです。ただし、それが関数ではなくプロパティであることを確認したい場合は、toEqual()
をjasmine.any(Function)
とともに使用できます。次に例を示します。 http://jsbin.com/eREYACe/1/edit
私はしようとします:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr.open).toBeDefined()
これを見てください フィドル 。
こうやってやった。 Angular例:
beforeEach(inject(function ($injector) {
service = $injector.get("myService");
}));
it("should have myfunction function", function () {
expect(angular.isFunction(service.myfunction)).toBe(true);
});
Jasmineでは、独自の「マッチャー」を作成できます。ドキュメントはそれを説明しています。 http://jasmine.github.io/2.0/custom_matcher.html
と呼ばれる非常に具体的なマッチャーを書くことができます
expect(obj).toHaveMethod("methodName");
個人的には、値の型をチェックするもう少し一般的なものを書くでしょう。そうすれば、メソッドとオブジェクト/インスタンスが定義されているかどうかをチェックするだけでなく、値を格納できるものであれば何でもチェックできます。また、関数タイプ以外のタイプをチェックすることもできます。
expect(obj.methodName).toBeA(Function);
これを機能させるには、必ずtoBeA "マッチャー"を追加する必要があります。
beforeEach(function(){
jasmine.addMatchers({
toBeA: toBeA
});
});
function toBeA() {
return {
compare: function (value, type) {
var result = {pass: val != null && val.constructor === type || val instanceof type};
if (result.pass) {
result.message = 'Expected ' + value + ' to be a ' + type.name
} else {
result.message = 'Expected ' + value + ' to not be a ' + type.name
}
return result;
}
};
}