【问题标题】:Sinon stub doesn't seem to work when object destructuring is used使用对象解构时,Sinon 存根似乎不起作用
【发布时间】:2019-07-28 15:21:27
【问题描述】:

假设您在模块 myModule 中有一个名为 myMethod 的方法,如下所示:

function myMethod() {
   return 5;
}
module.exports.myMethod = myMethod;

现在如果我想用 Sinon 存根这个方法返回 2 而不是 5 我会写

const myModule = require('path/myModule');
sinon.stub(myModule, 'myMethod').returns(2);

现在在你实际调用方法的地方,你碰巧通过对象销毁导入了这样的方法

const { myMethod } = require('path/myModule');
console.log(myMethod()); // Will print 5

如果你这样做,myMethod 实际上不会被存根,并且不会返回 2 而是 5。

如果您再次需要该模块并使用所需模块中的功能,它将起作用

const myModule= require('path/myModule');
console.log(myModule.myMethod()); // Will print 2

除了改变我导入函数的方式之外,还有其他人对此有解决方案吗?

【问题讨论】:

    标签: node.js sinon


    【解决方案1】:

    存根的myMethod 将具有与原始方法不同的引用。在解构示例中,您要在引用被存根之前对其进行设置。

    // cannot be stubbed
    const { myMethod } = require('path/myModule');
    
    // can be stubbed
    const myModule = require('path/myModule');
    myModule.myMethod();
    

    查看this类似问题了解更多详情

    【讨论】:

    • 那么,在这种情况下,由于引用不同,似乎除了重构我的导入之外别无他法?
    • 这就是我的解释,是的 - 您需要将解构放置在更接近函数调用而不是模块初始化时,以便在初始化后出现对存根的引用
    • 有道理,非常感谢!
    • “别无他法”有点太严格了。您可以针对链接接缝,这意味着您使用 proxyquire 或 rewire 连接到模块加载。但这与诗乃本身无关。
    【解决方案2】:

    这是可能的。

    请注意,一旦运行:

    const { myMethod } = require('./lib');
    

    ...它会记住那一刻的myMethod

    因此,您只需确保在代码运行之前设置存根


    所以对于这个lib.js

    function myMethod() {
      return 5;
    }
    module.exports.myMethod = myMethod;
    

    还有这个code.js

    const { myMethod } = require('./lib');
    console.log(myMethod());
    

    你只需要这样做:

    const sinon = require('sinon');
    
    const myModule = require('./lib');
    sinon.stub(myModule, 'myMethod').returns(2);  // set up the stub FIRST...
    require('./code');  // ...THEN require the code (prints "2")
    

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2019-03-06
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多