当前位置: 首页 > 知识库问答 >
问题:

Sinon存根未替换功能。

宋经业
2023-03-14

我尝试了一个虚拟模块,并存根,但不工作。

应用程序.js

function foo()
{
    return run_func()
}
function run_func()
{
    return '1'
}
exports._test = {foo: foo, run_func: run_func}

test.js

app = require("./app.js")._test
describe('test', function(){
    it('test', function(){

        var test_stub = sinon.stub(app, 'run_func').callsFake(
          function(){
            return '0'
        })
        test_stub.restore()

        var res = app.foo()
        assert.equal('0', res)
    })
})

我尝试了以下建议:sinon stub不替换函数

但还是一样。它不能取代功能。

共有1个答案

东方琪
2023-03-14

你这里有几个问题。首先,您正在调用test_stub。创建存根后,restore()立即将其替换为原始函数,从而有效地完全撤消存根。

恢复用于在测试完成后清理虚假方法。所以你确实想调用它,但你应该在每个之后的中这样做。

你的第二个问题有点微妙。Sinon的工作原理是覆盖对对象上函数的引用,使其指向其他东西(在本例中是存根)。它不能替换其他上下文中对同一函数的引用。

当您呼叫sinon时。存根(app,'run_func'),有点像这样:

app.run_func = sinon.stub()

...除了前一种方式存储了< code>app.run_func的原始值和名称,允许您在以后轻松恢复它。

请注意,此时,变量app指向使用导出导出的同一对象_test={foo:foo,run_func:run_func}但是,您的foofunction没有通过这个对象引用run_unc。它直接在app的范围内引用它。js,这是sinon无法影响的。

看看下面的例子。你还会注意到我还清理了其他一些东西:

应用程序.js:

exports.foo = function() {
    return exports.run_func();
};

exports.run_func = function() {
    return '1';
};

test.js:

const app = require('./app');
const sinon = require('sinon');

describe('app', function() {
    describe('foo', function() {
        beforeEach(function() {
            sinon.stub(app, 'run_func').returns('0');
        });

        afterEach(function() {
            app.run_func.restore();
        });

        it('returns result of app.run_func', function() {
            assert.equal(app.foo(), '0');
        });
    });
});

请注意,在 app.js导出是指 app测试.js中完全相同的对象。这是因为节点中的模块默认导出一个空对象,您可以通过 export 变量将其分配给该对象。

 类似资料:
  • 我正在尝试使用sinon存根替换一个可能需要很长时间的函数。但是当我运行测试时,测试代码似乎没有使用sinon存根。 这是我要测试的代码。 这是测试代码。 我得到一个断言错误 我做错了什么?为什么不使用存根?摩卡的测试框架。

  • 我有一个依赖于另一个函数的函数,而不是测试依赖关系,我只想测试依赖函数的特定结果。然而,当我存根函数时,什么都不会发生,返回的结果就好像我从来没有存根函数一样。 示例代码:

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对

  • 我正在尝试测试一个es6类,但我不知道如何用sinon存根一个函数模块。测试不是sm下的覆盖线。callSoap函数 我试试这个: module.js index.js(这是模块的索引) my-class.js test.js 我尝试在soapModule上存根,但生成了以下错误: 无法存根不存在的自己的属性call Soap

  • 如果我已经通过< code > var a = sinon . createstuinstance(my contractor)创建了一个实例。 如何替换其中一个存根函数,如 。 我这样做的主要原因是想实现这个提到的多个回调解决方法

  • 我正在尝试测试点击一种反应成分,以利用酶Sinon 我的Comp组件有一个引发异常的保存功能 当我运行测试时,我希望不会抛出任何错误,并且存根中的空函数会被触发——但事实并非如此。组件内部的实际函数被触发,而不是空的存根。