web-dev-qa-db-ja.com

ジャスミンを使用してコンストラクターをスパイ

特定のオブジェクトが作成され、それらに対してメソッドが呼び出されるかどうかをテストするために、Jasmineを使用しています。

フリップカウンターオブジェクトを作成し、それらのsetValueメソッドを呼び出すjQueryウィジェットがあります。 flipcounterのコードはこちらです: https://bitbucket.org/cnanney/Apple-style-flip-counter/src/13fd00129a41/js/flipcounter.js

フリップカウンターは次を使用して作成されます。

var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});

フリップカウンターが作成され、それらに対してsetValueメソッドが呼び出されることをテストします。私の問題は、これらのオブジェクトが作成される前であっても、どのようにしてこれらのオブジェクトをスパイするのかということです。コンストラクターをスパイし、偽のオブジェクトを返しますか?サンプルコードは本当に役立ちます。ご協力いただきありがとうございます! :)

更新:

私はこのようにflipCounterをスパイしようとしました:

myStub = jasmine.createSpy('myStub');
spyOn(window, 'flipCounter').andReturn(myStub);

//expectation
expect(window.flipCounter).toHaveBeenCalled();

次に、flipCounterによるsetValue呼び出しのテスト:

spyOn(myStub, 'setValue');

//expectation
expect(myStub.setValue).toHaveBeenCalled();

flipCounterを初期化する最初のテストは問題ありませんが、setValue呼び出しをテストするために、「setValue()メソッドが存在しません」というエラーを取得するだけです。私はこれを正しい方法でやっていますか?ありがとう!

59
gerky

flipCounterは、オブジェクトを作成する場合でも、単なる別の関数です。したがって、次のことができます。

var cSpy = spyOn(window, 'flipCounter');

スパイを入手し、あらゆる種類の検査を行うか、次のように言います。

var cSpy = spyOn(window, 'flipCounter').andCallThrough();
var counter = flipCounter('foo', options);
expect(cSpy).wasCalled();

しかし、これはやり過ぎのようです。それで十分です:

var myFlipCounter = new flipCounter("counter", options);
expect(myFlipCounter).toBeDefined();
expect(myFlipCounter.getValue(foo)).toEqual(bar);
41
ggozad

jasmine.createSpyObj() を使用して、見張る必要があるプロパティを持つオブジェクトをモックすることをお勧めします。

myStub = jasmine.createSpyObj('myStub', ['setValue']);
spyOn(window, 'flipCounter').andReturn(myStub);

これは、flipCounter実装に依存することなく、予想されるflipCounterインターフェイスとの相互作用をテストします。

10
Jared Deckard

flipCounterプロパティをスパイ関数に設定するsetValueの偽のコンストラクターを実装する必要があります。テストしたい関数がこれだとしましょう:

function flipIt() {
  var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
  myFlipCounter.setValue(100);
}

スペックは次のようになります。

describe('flipIt', function () {
  var setValue;
  beforeEach(function () {
    setValue = jasmine.createSpy('setValue');
    spyOn(window, 'flipCounter').and.callFake(function () {
      this.setValue = setValue;
    });
    flipIt();
  });
  it('should call flipCounter constructor', function () {
    expect(window.flipCounter)
      .toHaveBeenCalledWith("counter", {inc: 23, pace: 500});
  });
  it('should call flipCounter.setValue', function () {
    expect(setValue).toHaveBeenCalledWith(100);
  });
});
4
Stephen Veit

以下は「ウィンドウ」に依存しません。これがテストしたいコードだとしましょう-

function startCountingFlips(flipCounter) {
    var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
}

あなたのテストは-

var initSpy = jasmine.createSpy('initFlipCounter');
var flipCounter = function(id, options) {
    initSpy(id, options);
}
startCountingFlips(flipCounter);
expect(initSpy).toHaveBeenCalledWith("counter", {inc:23, pace:500});
3
surtyaar

コンストラクターをテストする私のバージョンは、プロトタイプをスパイすることです:

spyOn(flipCounter.prototype, 'setValue').and.callThrough();
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1);
1
HolgerJeromin