【问题标题】:Sinon mock: check args of 2nd call onlySinon 模拟:仅检查第二次调用的参数
【发布时间】:2018-08-31 17:37:24
【问题描述】:

我正在测试一个函数,该函数将对 mongo 数据库进行 2 次调用,每个调用都有不同的参数。该函数称为“saveAchProgress”,将向 db 发出 2 个“updateOne”请求。

我正在使用模拟,因为我需要监视函数并同时阻止数据库调用(在单元测试期间未连接到数据库)。

我想检查参数,但仅限于第二个数据库调用

我可以轻松地检查呼叫 1 和 2 是否正确拨打:

               it('should update if value >= achNumber', async function (): Promise<void> {
                mock.expects('updateOne').twice().returns('foo');
                await achievementsServiceFunctions.saveAchProgress(1, 1);
                mock.verify();
            });

但是,当我检查参数时,第一次调用的参数出现错误。

            it('should update game with right arguments: collection', async function (): Promise<void> {
                mock.expects('updateOne').withArgs('game', sinon.match.any, sinon.match.any).returns('foo');
                await achievementsServiceFunctions.saveAchProgress(1, 1);
                mock.verify();
            });

我知道 sinon mock 有自己的检查方式,但我在 sinon 文档中找不到适合我需要的内容。有解决办法吗?

【问题讨论】:

    标签: node.js unit-testing typescript mocking sinon


    【解决方案1】:

    我遇到了类似的问题。执行以下操作对我有帮助:

    Sinon Mocks 甚至在函数被实际调用之前就设置了期望值。

    所以不要使用mock.expects('updateOne').twice()

    你可以试试:

    mock.expects('updateOne').once().withExactArgs(
      ... YOUR EXPECTED ARGS FOR THE FIRST CALL
    );
    
    mock.expects('updateOne').once().withExactArgs(
      ... YOUR EXPECTED ARGS FOR THE SECOND CALL
    );
    

    这样,您对“updateOne”的第一次调用需要您在第一行中指定的参数,而您对“updateOne”的第二次调用需要您在第二行中指定的参数。

    【讨论】:

      【解决方案2】:

      Sinon Mocks 抛出任何未明确预期的调用。您只设置了第二个调用,而不是第一个调用,因此第一个(具有错误参数)抛出。

      我从来没有真正在 sinon 中使用过 Mock api,所以我可能是错的,但我不相信你想要做的事情是可能的。但是,使用Stubs 和独立的assertions 很容易。

      假设 obj 是您当前发送到 sinon.mock 以创建您的 mock 变量的东西:

      beforeEach(function() {
          sinon.stub(obj, 'updateOne').returns('foo);
      });
      
      afterEach(function() {
          obj.updateOne.restore();
      });
      
      it('should update game with right arguments: collection', async function() {
          await achievementsServiceFunctions.saveAchProgress(1, 1);
          sinon.assert.calledWith(obj.updateOne.secondCall, 'game');
      });
      

      顺便说一句,withArgs 允许在指定参数之后添加其他参数,因此您不需要 sinon.match.any 匹配器。如果你使用withExactArgs,你只需要那些。

      【讨论】:

        猜你喜欢
        • 2020-08-10
        • 2012-07-31
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2021-01-23
        • 2017-10-24
        相关资源
        最近更新 更多