33

和有什么区别

  • 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)

该文档没有提供任何示例来阐明这两种方法,但我对它们很好奇。

4

1 回答 1

38

我相信文档中概述的方法如下:

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

yields和之间的主要区别callsArg可以在 sinon 的产量文档中找到:

如果一个方法接受多个回调,则需要使用 callsArg 让存根调用除第一个回调之外的其他回调。

yields将使用您提供给它的任何可选参数调用它遇到的第一个函数参数。callsArg将尝试 在该调用的对象内的给定索引arguments处调用函数参数,并且不会将任何参数传递给它(您可以callArgWith用于该行为)。

spy.yield非常相似,stub.yields只是它是 spy API 的一部分,并且它调用传递给它的所有回调。

这是一些展示差异的示例(如果示例有点做作,请原谅我):

产量:

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

调用参数:

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();
于 2013-08-15T13:34:41.070 回答