71

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

フリップカウンターオブジェクトを作成し、それらに対してsetValueメソッドを呼び出すjQueryウィジェットがあります。フリップカウンターのコードは次のとおりです: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();

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

4

6 に答える 6

50

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);
于 2012-02-19T09:26:38.610 に答える
15

jasmine.createSpyObj()スパイする必要のあるプロパティを持つオブジェクトをモックしたい場合に使用することをお勧めします。

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

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

于 2016-06-09T20:26:35.847 に答える
5

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

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});
于 2014-06-05T15:33:29.210 に答える
4

プロパティをスパイ関数に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);
  });
});
于 2015-10-20T13:48:42.497 に答える
3

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

spyOn(flipCounter.prototype, 'setValue').and.callThrough();
var myFlipCounter = new flipCounter("counter", {inc: 23, pace: 500});
expect(flipCounter.prototype.setValue).toHaveBeenCalledTimes(1);
于 2017-09-20T08:35:38.383 に答える
-4

ジャスミンモックを使用してこれを行う方法はわかりませんが、強力なモック/スパイ/スタブが必要な場合は、ジャスミンで非常にうまく機能するsinon.jsをお勧めします。

ドキュメントから:

テストスパイは、引数、戻り値、この値、およびすべての呼び出しに対してスローされた例外(存在する場合)を記録する関数です。テストスパイは無名関数にすることも、既存の関数をラップすることもできます。

モック(およびモックの期待値)は、事前にプログラムされた動作(スタブなど)と事前にプログラムされた期待値を持つ偽のメソッド(スパイなど)です。モックが期待どおりに使用されていない場合、モックはテストに失敗します。

sinon.jsを使用すると、別のスパイを返すflipCounterコンストラクターのモックを作成できます。

次に、コンストラクターがconstructorMock.calledWithNew()を使用して呼び出されたことを表明し、返されたスパイがreturnedSpy.calledWith(arg1、arg2 ...)で呼び出されたことを表明します。

于 2012-02-19T09:02:28.273 に答える