使用Truffle与Mocha测试智能合约时Web3导入异常问题排查
问题原因
这事儿其实是Web3.js版本升级带来的小坑——从v1.x开始,直接const web3 = require('web3')拿到的是Web3的构造函数类,不是现成可用的实例。
web3.utils是这个类的静态属性,不用实例化就能调用,所以toWei能正常跑;- 但
web3.eth是只有实例才有的属性,你直接拿类去访问它,自然会得到undefined,这就是报错和VS Code提示的根源。
最省心的解决方案:用Truffle内置的Web3实例
你完全没必要自己手动导入Web3!Truffle在测试环境里已经自动给你注入了一个连接好测试节点(比如Ganache)的Web3实例,直接用全局的web3变量就行:
// 删掉那行 const web3 = require('web3') contract('YourFundraiserContract', (accounts) => { it('should fetch contract balance', async () => { const myContract = await YourContract.deployed(); const balance = await web3.eth.getBalance(myContract.address); console.log('Contract balance:', balance); }); });
这个全局web3已经配置好了所有连接信息,直接用就完事儿,省得自己折腾实例化。
如果你非要自己导入Web3:手动实例化
要是你因为特殊需求必须自己导入,那得先把类实例化,连接到你的测试节点:
// 注意这里变量名用Web3(大写),区分构造函数和实例 const Web3 = require('web3'); // 连接到Truffle默认的测试节点地址,根据你的Ganache配置调整端口 const web3 = new Web3('http://localhost:7545'); contract('YourFundraiserContract', (accounts) => { it('should fetch contract balance', async () => { const myContract = await YourContract.deployed(); const balance = await web3.eth.getBalance(myContract.address); console.log('Contract balance:', balance); }); });
这里关键是要区分构造函数(Web3)和实例(web3),别搞混了变量名。
内容的提问来源于stack exchange,提问作者eitan
相关产品推荐
相关产品推荐

