You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:28:18