繁体   English   中英

sinon存根不替换功能。

[英]sinon stub not replacing function.

我尝试了一个虚拟模块并将其存根,但不起作用。

app.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不替换功能

但仍然是一样的。 它不会取代功能。

你有几个问题。 第一个是你在创建存根之后立即调用test_stub.restore() ,这会导致它用原始函数替换它自己,完全有效地撤消存根。

restore是为了测试完成清理假方法。 所以你确实想要调用它,但你应该在afterEach.这样做afterEach.

你的第二个问题有点微妙。 Sinon通过覆盖对对象上的函数的引用来工作,使其指向其他东西(在这种情况下,存根)。 它不能替换其他上下文中对相同函数的引用。

当你调用sinon.stub(app, 'run_func') ,它有点像这样:

app.run_func = sinon.stub()

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

请注意,此时,变量app指向您使用exports._test = {foo: foo, run_func: run_func}导出的同一对象exports._test = {foo: foo, run_func: run_func}但是,您的foo函数未通过此对象引用run_func 它直接在app.js的范围内引用它,而sinon不会影响它。

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

app.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 exports如何引用apptest.js完全相同的对象。 这是因为节点中的模块默认导出一个空对象,您可以通过exports变量将其分配给该对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM