2013-03-28 3 views
21

を持っているかどうかをテストするために、私は以下のように、オブジェクトが特定のメソッドを持っているかどうかをテストしたいかどうか:ジャスミンは、オブジェクトが特定のメソッドまたは私はジャスミンを使用していない

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(@xhr).toHaveMethod "open" # I want to test like this! 

どのようにテストすることができますか?ご親切にありがとうございます。

答えて

24

組み込みの方法はありませんが、これを行うことで目的の結果が得られます。

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(typeof @xhr.open).toBe("function") 

他の回答で提案されているように、それが定義されていた場合、そのテストに注意してください、それが通過し、それはいけない、いくつかのエッジケースを持っています。次の構造をとると、それは合格し、それは間違いなく機能です。

{ open : 1 } 
+0

この問題は、期待通りに失敗した場合、メッセージが「期待どおりに機能していないと期待されています」というメッセージが表示されます。プロパティ 'open''を持つ 'Expected object' @xhr 'のようなものが良いでしょう。 – Jorn

11

私がしようとするだろう:

it "should have 'open' method", -> 
    @xhr = ajax.create() 
    expect(@xhr.open).toBeDefined() 

このfiddleを参照してください。

24

@davidが正しく回答しました。 toBeDefined()はおそらくあなたが望むものです。しかし、それが機能でありプロパティではないことを確認したい場合はtoEqual()jasmine.any(Function)を使用できます。次に例を示します。http://jsbin.com/eREYACe/1/edit

-1

私は、このソリューションを試してみましたが、それは動作します:

spyOn(@xhr,"open") 

オープン関数が存在しない場合には、それはそれで

0

ジャスミンをspyig開始することができないので、それはエラーをスローします独自の「マッチャー」を書くことができます。ドキュメンテーションはそれを説明します。 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; 
    } 
    }; 
} 
2

私はこのようにしました。角度の例:

beforeEach(inject(function ($injector) { 
    service = $injector.get("myService");  
})); 

it("should have myfunction function", function() { 
    expect(angular.isFunction(service.myfunction)).toBe(true); 
}); 
関連する問題