Sinon.js,只有一个方法一次?

时间:2016-05-20 09:39:10

标签: javascript node.js tdd sinon stub

我想知道sinon.js是否有可能只将方法存在一次?

例如:

sinon.stub(module, 'randomFunction', 'returnValue/function');

在我的测试中, module.randomFunction 将在同一个测试中多次调用 ,但我只希望存根触发一次,然后将其恢复为函数恢复正常行为。

模拟真实代码:

myModule.putItem(item, function (err, data) {
  if (err) {
    // do stuff
    return callback();
  } else {
    // do other stuff
    return callback(null, data);
  }
});

我第一次想要触发错误,其他时候我只是想让它继续真正的流程。

这在sinon有可能吗?

亲切的问候,

编辑:我根据@Grimurd的回答发布了我找到的问题解决方案

4 个答案:

答案 0 :(得分:3)

<强>解决方案:

sandbox.stub(module, 'putItem')
  .onFirstCall().yields('ERROR')
  .onSecondCall().yields(null, item)

根据@grimurd的答案,我设法让它与&#39; yield&#39;合作。 Yields触发它在原始方法签名中找到的第一个回调函数。

因此,在第一次通话时,我基本上会说callback('error'),在第二次通话时,我说callback(null, item)

不知怎的,我确实想知道回调是否是一个比收益更好的方法名称;)

感谢您的回答!

答案 1 :(得分:2)

是的,这是可能的。假设您使用mocha作为测试框架。

describe('some tests', function() {
    var sandbox;

    beforeEach(function() {
        sandbox = sinon.sandbox.create();
    });

    afterEach(function() {
        sandbox.restore();
    })

    it('is a test with a stub', function() {
        // This gets restored after each test.
        sandbox.stub(module, 'randomFunction', 'returnValue/function');
    })
})

查看sinon sandbox api了解详情。

<强>更新

要回答您的实际问题,

describe('some tests', function() {
    var sandbox;

    beforeEach(function() {
        sandbox = sinon.sandbox.create();
    });

    afterEach(function() {
        sandbox.restore();
    })

    it('is a test with a stub', function() {
        // This gets restored after each test.
        sandbox.stub(module, 'randomFunction')
            .onFirstCall().returns('foo')
            .onSecondCall().returns('bar')
            .onThirdCall().returns('foobar');
    })
})

记录http://sinonjs.org/docs/搜索stub.onCall(n)

答案 2 :(得分:2)

其他答案似乎忽略了问题的关键部分:“我只希望存根触发一次然后恢复它,以便函数恢复其正常行为”。

以下代码对给定方法进行一次存根,然后恢复为以前的行为:

let stub = sandbox.stub(module, 'method')
    .onFirstCall().returns(1)
    .onSecondCall().callsFake((...args) => {
        stub.restore();
        return module.method(...args);
    });

答案 3 :(得分:0)

IMO 实现预期行为的更简单方法。来自文档:

<块引用>

stub.callThrough();
导致在没有条件存根匹配时调用包装在存根中的原始方法。

所以,一个真实的例子是:

let stub = sandbox.stub(module, 'method')
  .onSecondCall().returns('whatever');

stub.callThrough();

请注意,原始方法也将在第一次被调用时执行。