【问题标题】:Fake calling of a function with specific arguments in Sinon在 Sinon 中假调用具有特定参数的函数
【发布时间】:2019-01-08 14:39:35
【问题描述】:

我在这方面已经很长时间了,也许我只是遗漏了一些东西,但我的研究没有产生任何对我有帮助的结果。

所以我的问题是:

如果我有这样的代码:

shell.on('message', function (message) {
// do something
});

而且我想测试它,就好像它被某个消息(甚至是错误)调用一样,我可以用诗乃以某种方式做到这一点吗? (只是将做某事放在外部函数中只会在某种程度上起作用,所以我确实希望得到一个答案,至少有一种方法可以假调用shell.on 来测试内部函数是否被调用)。

“shell”是 npm 包“Python-Shell”的 shell 的一个实例

也许这根本不可能,或者我只是瞎了眼,但非常感谢任何帮助!

【问题讨论】:

    标签: javascript unit-testing mocha.js sinon


    【解决方案1】:

    python-shell 实例是EventEmitter 的实例。因此,您可以通过发出消息来触发 on 处理程序:

    var PythonShell = require('python-shell');
    
    var pyshell = new PythonShell('my_script.py');
    
    pyshell.on('message', function (message) {
        console.log("recieved", message);
    });
    
    pyshell.emit('message', "fake message?")
    // writes: 'recieved fake message?'
    

    您也可以使用 Sinon 存根实例并调用 yields 来调用回调:

    const sinon = require('sinon')
    var PythonShell = require('python-shell');
    
    var pyshell = new PythonShell('my_script.py');
    var stub = sinon.stub(pyshell, "on");
    stub.yields("test message")
    // writes received test message to console
    
    pyshell.on('message', function (message) {
        console.log("received", message);
    });
    

    如果您不想在运行测试时阻止默认行为,这可能会更有用。

    【讨论】:

    • 首先感谢您的精彩回答,它值得大力支持!我想我误解了yields 的工作原理(我认为它只是替换函数的返回值以在测试中调用存根时返回给定的参数,但据我所知,现在stub.yields 替换它并另外调用立即发挥作用)。我现在在我的测试中使用sinon.stub(PythonShell.prototype, "on") 将其存根,就像我所做的那样,例如"send" 但由于某种原因 codeInsidePyshellonSpy.calledOnce.should.be.true(); 不返回 true。
    • 第一部分就像一个魅力,只需将 pyshell.emit 包装在一个函数中就可以在我的测试中使用它了。非常感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2020-11-25
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多