web-dev-qa-db-ja.com

オブジェクトに特定のメソッドがあるかどうかをテストするJasmine

私はJasmineを使用していて、以下のように、オブジェクトに特定のメソッドがあるかどうかをテストしたいと思います。

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

どうすればテストできますか?ご親切にありがとうございます。

23
Feel Physics

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

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

他の回答で提案されているように定義されているかどうかをテストすると、合格するはずのEdgeケースがいくつかあることに注意してください。次のような構造をとれば合格し、間違いなく機能しません。

{ open : 1 }
24
HoLyVieR

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

28
Sukima

私はしようとします:

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

これを見てください フィドル

11
David

こうやってやった。 Angular例:

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

it("should have myfunction function", function () {
    expect(angular.isFunction(service.myfunction)).toBe(true);
});
2
YourReflection

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;
    }
  };
}
0
bas080