web-dev-qa-db-ja.com

Sinon.jsのyield()、yields()、callsArg()を理解する

違いは何ですか

  • stub.yield([arg1, arg2, ...])
  • spy.yields([arg1, arg2, ...])
  • stub.callsArg(index)

Sinon.js スタブライブラリで?

stub.yield()は、私が把握できた唯一のものです。

_  stub = sinon.stub(API, 'call_remote');
  callback = sinon.spy();
  API.call_remote('help', callback);
  @stub.yield( "solution!" );
  @stub.calledOnce.should.be.true;
  @callback.calledOnce.should.be.true;
  @callback.args[0][0].should.eql( "solution!" );
_

Should.jsでテストしたように、すべてのアサーションがパスします。

stub.yields()stub.callsArg(index)に同様のテストパターンがありますか?

ドキュメントには、これらの他の2つの方法を明確にするための例はありませんが、私はそれらに興味があります。

28
TimeEmit

ドキュメントに記載されている方法は次のとおりです。

  • spy.yield
  • stub.yields
  • stub.callsArg

yieldscallsArgの主な違いは、sinonの収量に関するドキュメントに記載されています。

メソッドが複数のコールバックを受け入れる場合、callsArgを使用して、スタブに最初のコールバック以外のコールバックを呼び出させる必要があります。

yieldsは、検出したfirst関数の引数を、指定したオプションの引数とともに呼び出します。 callsArgは、その呼び出しのargumentsオブジェクト内の指定されたインデックスで関数引数を呼び出そうとし、引数を渡しません(callArgWithその動作に対して)。

spy.yieldstub.yieldsと非常に似ていますが、それはspy APIの一部であり、それに渡されるすべてのコールバックを呼び出します。

違いを示す例をいくつか示します(例が少し不自然な場合はご容赦ください)。

利回り:

var fn = sinon.expectation.create().withArgs(1, 2);
var stub = sinon.stub().yields(1, 2);
stub(fn);
fn.verify();

CallsArg:

var f1 = sinon.expectation.create().never();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().callsArg(1);
stub(f1, f2);
f1.verify();
f2.verify();

産出:

var f1 = sinon.expectation.create().once();
var f2 = sinon.expectation.create().once();
var stub = sinon.stub().yield();
stub(f1, f2);
f1.verify();
f2.verify();
31
Travis Kaufman