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)
})
})
我尝试了以下建议:
但还是一样。它不会取代功能。
你这里有几个问题。首先是您在创建存根后立即调用 test_stub.restore()
,这会导致它用原始函数替换自身,有效地完全撤消存根。
restore
用于在 测试完成后 清理虚假方法。所以你确实想调用它,但你应该在 afterEach.
你的第二个问题有点微妙。 Sinon 的工作原理是覆盖对象上对函数的引用,使其指向其他对象(在本例中为存根)。它不能替换在其他上下文中对同一函数的引用。
调用sinon.stub(app, 'run_func')
的时候,有点像这样:
app.run_func = sinon.stub()
...除了前一种方式存储了app.run_func
的原始值和名称,允许您稍后轻松恢复它。
请注意,此时变量 app
指向您使用 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
与 test.js
中的 app
所指的完全相同的对象。这是因为默认情况下节点中的模块导出一个空对象,您可以通过 exports
变量分配给它。
我尝试了一个虚拟模块并将其存根,但没有用。
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)
})
})
我尝试了以下建议:
但还是一样。它不会取代功能。
你这里有几个问题。首先是您在创建存根后立即调用 test_stub.restore()
,这会导致它用原始函数替换自身,有效地完全撤消存根。
restore
用于在 测试完成后 清理虚假方法。所以你确实想调用它,但你应该在 afterEach.
你的第二个问题有点微妙。 Sinon 的工作原理是覆盖对象上对函数的引用,使其指向其他对象(在本例中为存根)。它不能替换在其他上下文中对同一函数的引用。
调用sinon.stub(app, 'run_func')
的时候,有点像这样:
app.run_func = sinon.stub()
...除了前一种方式存储了app.run_func
的原始值和名称,允许您稍后轻松恢复它。
请注意,此时变量 app
指向您使用 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
与 test.js
中的 app
所指的完全相同的对象。这是因为默认情况下节点中的模块导出一个空对象,您可以通过 exports
变量分配给它。