【问题标题】:sinon.js : stub call does not increment callCountsinon.js:存根调用不会增加 callCount
【发布时间】:2021-02-04 15:50:45
【问题描述】:

sinon.js 9.0.2

在测试中我创建了一个存根:

test.js

const myHandler = {
  handle: (some_var_to_pass) => sinon.stub()["resolves"]([{ whatever: "whatever" }]),
};

然后将测试中的实际代码作为一些端点请求(使用async / await)来执行以下代码:

code.js

module.exports = (myHandler) => ({
  getStuff: async (req, res, next) => {
  const var1 = "something1";
  const var2 = "something2";
  const my_response = await myHandler.handle()(var1, var2);

  console.log("my response", JSON.stringify(my_response)); //correct, returns { whatever: "whatever"}
  console.log("Executed stub: ", myHandler.handle(some_var_to_pass).callCount); //always returns zero

我控制myHandler.handle 正确地通过存根创建,my_response

{ whatever: "whatever"}

但是,myHandler.handle().callCount 保持为零(不是undefined)。我缺少什么使它正确增加?或者我需要在创建存根时将.callCount 实际设置为 1(会很奇怪)?

【问题讨论】:

    标签: javascript testing async-await sinon stub


    【解决方案1】:

    你没有存根 myHandler.handle 方法。您只存根 myHandler.handle 方法返回的函数。单元测试解决方案:

    code.js:

    module.exports = (myHandler) => ({
      getStuff: async (req, res, next) => {
        const var1 = 'something1';
        const var2 = 'something2';
        const my_response = await myHandler.handle()(var1, var2);
        return my_response;
      },
    });
    

    code.test.js:

    const code = require('./code');
    const sinon = require('sinon');
    
    describe('64468517', () => {
      it('should pass', async () => {
        const returnedFn = sinon.stub().resolves([{ whatever: 'whatever' }]);
        const myHandler = {
          handle: sinon.stub().returns(returnedFn),
        };
        await code(myHandler).getStuff();
        expect(myHandler.handle.callCount).to.be.eq(1);
        sinon.assert.calledOnce(myHandler.handle);
        sinon.assert.calledWithExactly(returnedFn, 'something1', 'something2');
      });
    });
    

    单元测试结果:

      64468517
        ✓ should pass
    
    
      1 passing (13ms)
    
    ----------|---------|----------|---------|---------|-------------------
    File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ----------|---------|----------|---------|---------|-------------------
    All files |     100 |      100 |     100 |     100 |                   
     code.js  |     100 |      100 |     100 |     100 |                   
    ----------|---------|----------|---------|---------|-------------------
    

    【讨论】:

    • 很好,修复了callCount 的测试,谢谢。但是这样req 会丢失——在code.js 中它现在是undefined,我需要它来分配var1,在实际代码中它是const var1 = req.query.something1'。可以访问原始代码req.query - 我现在应该如何访问它?
    • @SwissNavy 您可以声明reqresnext 变量并将它们传递给getStuff 方法。
    • 谢谢。您的代码有效(也传递了变量),所以我接受了您的回答。但是它对我的问题没有帮助,因为我必须在测试和代码中遵循稍微不同的代码结构。
    • 实际上我设法将您的答案纳入我的代码中。
    【解决方案2】:

    因为当你有 line:myHandler.handle(some_var_to_pass) 时,你会启动新的存根,当然它的 callCount 为 0。

    如何解决:将myHandler.handle(some_var_to_pass) 保存到一个变量中,调用并期望使用该变量。

    例子:

    const { expect } = require('chai');
    const sinon = require('sinon');
    
    const myHandler = {
      // Call myHandler.handle() will return sinon.stub which resolves to array object.
      handle: () => sinon.stub()['resolves']([{ whatever: 'whatever' }]),
    };
    
    describe('myHandler', function() {
      it('handle', async function() {
        const var1 = 'something1';
        const var2 = 'something2';
        // Get the stub variable.
        const stub = myHandler.handle();
        // const result = await myHandler.handle()(var1, var2);
        // You use stub variable.
        const result = await stub(var1, var2);
        // Make sure the result is correct.
        expect(result).to.deep.equal([{ whatever: 'whatever' }]);
        // Obviously, stub callCount should be 1.
        expect(stub.callCount).to.equal(1);
      });
    });
    

    当我在终端使用 mocha 运行它时:

    $ npx mocha index.test.js 
    
    
      myHandler
        ✓ handle
    
    
      1 passing (3ms)
    

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2016-08-16
      • 2016-12-02
      • 2012-08-11
      • 2018-03-06
      • 2014-01-31
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多