SinonJS Stub未替换方法:Database未定义错误求助
解决Stub数据库函数时的"ReferenceError: Database is not defined"问题
嘿,这个报错其实很常见——核心问题是你的代码里根本没让Node.js找到Database这个对象,不管是待测试的业务代码还是测试代码都没正确处理它的引入。我来一步步帮你修复:
1. 先搞定待测试代码的依赖问题
你的crypto.js里直接调用了Database.save(),但完全没引入这个Database模块。先把这步补上:
// 假设Database是你项目里的一个模块,替换成实际的文件路径 const Database = require('./database'); module.exports = { getName : function(name){ console.log(name); }, setupNewUser : function(info, callback) { var user = { name: info.name, nameUpperCase: info.name.toUpperCase() }; console.log(user.name,user.nameUpperCase) try { Database.save(user, callback); } catch(err) { callback(err); } } }
如果Database是第三方库,就把路径换成对应的包名(比如require('some-db-library'))。
2. 修复测试代码的Stub逻辑
测试代码里同样没引入Database,而且Stub的时候也没考虑回调的执行——如果save的回调不触发,可能会导致断言时机不对。修改后的测试代码如下:
const expect = require('chai').expect; const sinon = require('sinon'); const crypto = require('../crypto/crypto'); // 同样要引入Database模块,路径和待测试代码里保持一致 const Database = require('./database'); describe("test crypto module",function(){ it("should pass object with correct values to save",function(){ console.log("save"); // 创建save方法的Stub,并且设置自动调用回调参数 const saveStub = sinon.stub(Database, 'save').callsArg(1); const info = { name: 'test' }; const expectedUser = { name: info.name, nameUpperCase: info.name.toUpperCase() }; crypto.setupNewUser(info, function() { }); // 断言Stub被正确调用 sinon.assert.calledWith(saveStub, expectedUser); // 测试结束后恢复原方法,避免影响其他测试 saveStub.restore(); }) })
3. 额外的坑要注意
如果你的Database是类的实例(比如const db = new Database()),而不是直接调用静态方法,那上面的Stub方式就不生效了。这种情况下你需要用依赖注入重构代码,或者用Sinon的模块Stub功能:
// 比如如果待测试代码里是这样的: // const db = new Database(); // db.save(user, callback); // 测试时可以Stub类的原型方法 const saveStub = sinon.stub(Database.prototype, 'save').callsArg(1);
这样调整后,你的Stub应该就能正常工作,不会再出现ReferenceError了!
内容的提问来源于stack exchange,提问作者Saranya Mohandas
相关产品推荐
相关产品推荐

