【问题标题】:Testing a function argument which is a function测试作为函数的函数参数
【发布时间】:2016-11-28 21:07:41
【问题描述】:

我正在测试一些代码,但我在使用 sinon 时遇到了一些问题。问题是我的一个函数将一个函数作为参数,我还没有找到如何模拟它。

通常你会这样做:

var get = sinon.stub($, 'get')

然后在使用 $.get 之后:

sinon.assert.calledWith(get, expectedObject);

我的代码如下:

function getUsers(usersPromise) {
    const config = { date: new Date() };
    return usersPromise(config)
        .then(function (data) {
            // Do stuff
        })
}

我想做的是能够模拟 usersPromise。所以我会检查它是用正确的配置对象调用的(我省略了很多值),然后还在 .then 函数中声明一些东西。

sinon.stub(usersPromise) 不起作用,所以我有点迷茫。

【问题讨论】:

    标签: javascript testing mocha.js sinon


    【解决方案1】:

    没有足够的信息为您提供完整的解决方案,但您似乎首先要为 .then 创建存根

    var stubThen = sinon.stub();
    

    然后为get 创建一个存根,并将stubThen 作为返回对象的属性。

    var stubGet = sinon.stub();
    stubGet.returns({then: stubThen});
    

    然后在您的测试代码中将stubGet 传递给getUsers 并进行相应的验证。

    【讨论】:

      【解决方案2】:

      我想做的是能够模拟 usersPromise。

      遵守 TDD 的结果之一是它迫使您在隔离的、可测试的块中构建代码。这是您无法对函数的各个行或传递给它的参数执行测试的直接后果。在您的情况下,解决方案是以这种方式构建您的代码:

      var usersPromise = function(){};
      function getUsers(usersPromise) {};
      

      现在您已将usersPromise 设为一个隔离块,您可以对其进行测试,包括在调用getUsers 之前将其存根。

      【讨论】:

      • 我已经在这样做了。问题是我需要在 getUsers 中声明一些东西(也就是说 options 对象中有什么),我认为最好只存根参数并查看它的调用方式。
      • @kjonsson:你需要在getUsers 中声明什么?请包括在您的问题中。