web-dev-qa-db-ja.com

sinonスパイを使用した関数呼び出しの検証と引数の検査

bar()がユニットテストからfoo()内で呼び出されることを確認したいと思います。

Sinon spies が適切かもしれないと思ったが、それらの使用法がわからない。

メソッドが呼び出されたことを確認する方法はありますか?おそらくbar()呼び出しで使用される引数を抽出することもできますか?

var spy = sinon.spy(foo);

function foo(){
    bar(1,2,3);
}

function bar(){ }

foo();

// what to do with the spy?

http://jsfiddle.net/8by9jg07/

22
filur

あなたの場合、barが呼び出されたかどうかを確認しようとしているので、barではなくfooをスパイしたいです。

doc で説明されているとおり:

function bar(x,y) {
  console.debug(x, y);
}
function foo(z) {
  bar(z, z+1);
}
// Spy on the function "bar" of the global object.
var spy = sinon.spy(window, "bar");

// Now, the "bar" function has been replaced by a "Spy" object
// (so this is not necessarily what you want to do) 

foo(1);

bar.getCall(0).args => should be [1,2]

ここで、関数の内部をスパイすると、「foo」のテストがその実装に強く結び付けられるため、通常の "mockist vs Classical" の議論に陥ります。

29
phtrivier

代わりにバーをスパイしたかったのではないかとエイドリアンに同意します。

var barSpy = sinon.spy(bar);

次に、それが一度呼び出されたことを確認します

assert(barSpy.calledOnce);

まったく呼ばれた

assert(barSpy.called)

X回呼び出される

assert.equal(barSpy.callCount, x);

スパイの最初の呼び出しから引数を抽出する場合:

var args = barSpy.getCalls()[0].args

その後、これらの引数を使用して必要な処理を実行できます。

10
user1699348

Fooではなくbarをスパイしてはいけませんか?

var spy = sinon.spy(bar)

Fooを呼び出す:

foo()

チェックバーが呼び出されました:

console.log(spy.calledOnce)
1
Adrian Lynch