Truffle测试实战:如何用Mocha+Chai自动化测试你的智能合约
Truffle测试实战如何用MochaChai自动化测试你的智能合约【免费下载链接】truffle:warning: The Truffle Suite is being sunset. For information on ongoing support, migration options and FAQs, visit the Consensys blog. Thank you for all the support over the years.项目地址: https://gitcode.com/gh_mirrors/tr/truffleTruffle 内置的测试框架让智能合约测试变得极其简单——基于 Mocha Chai一条truffle test命令即可自动部署合约并运行全部断言。本文面向新手手把手带你掌握 Truffle 测试的完整流程搭建测试文件、编写用例、断言交易结果、验证事件发射并理解快照回滚带来的加速原理。1. 为什么选择 Truffle 测试在传统 Web3 开发中测试一个智能合约通常需要手动部署、手动调用 RPC、手动比对返回值。Truffle 把这些工作压缩成三件事能力说明 自动部署运行测试前自动执行迁移脚本合约处于刚部署的干净状态 开箱即用的断言全局注入assertChai和artifacts.require直接调用⚡ 快照加速支持evm_snapshot的链如 Ganache自动快照回滚测试之间零等待 事件解码测试失败时自动打印该测试期间发射的所有事件调试事半功倍Truffle Dashboard 也能为你的本地链提供可视化的交易签名与参数解码能力2. 一键开始最小化测试步骤最快配置方法其实只有三步在项目中创建test/目录放入.js测试文件文件名以.js结尾即可被truffle test识别用artifacts.require引入合约执行命令truffle test一个经典的 MetaCoin 用例可以直接参考仓库中的示例文件 metacoin.jsvar MetaCoin artifacts.require(./MetaCoin.sol); contract(MetaCoin, function (accounts) { it(should put 10000 MetaCoin in the first account, async function () { const instance await MetaCoin.deployed(); const balance await instance.getBalance.call(accounts[0]); assert.equal(balance.valueOf(), 10000, 初始余额不是 10000); }); });关键点解读contract(合约名, 回调)是 Truffle 注入的全局函数回调自动接收accounts账户数组.call()只读不转账不产生 Gas直接调用如sendCoin则发起真实交易assert.equal即 Chai 断言最后传入的字符串是失败时的提示语3. 常见测试套路清单3.1 验证状态变更转账类测试先记录初始值 → 发起交易 → 再读最终值 → 断言差值仓库示例见 metacoin.jsit(should send coin correctly, async function () { const meta await MetaCoin.deployed(); const start (await meta.getBalance.call(accounts[0])).toNumber(); await meta.sendCoin(accounts[1], 10, { from: accounts[0] }); const end (await meta.getBalance.call(accounts[0])).toNumber(); assert.equal(end, start - 10, 发送方余额应减少 10); });3.2 验证异常回滚用 Chai 的assert.isRejected或throws断言非法操作必须失败it(should revert on invalid recipient, async function () { const meta await MetaCoin.deployed(); assert.isRejected(meta.sendCoin(0x0000, 1, { from: accounts[0] })); });3.3 测试前准备before/afterEach标准 Mocha 钩子均可使用例如统一用before做数据初始化beforeEach中重置测试数据。超时时间也可在配置中调整——Truffle 默认before超时 120 秒、单测 300 秒见 TestRunner.ts。4. 失败时如何读日志自动事件解码当某个用例失败Truffle 会调用endTest逻辑自动扫描该测试起始区块之后的日志并解码输出Events emitted during test:→ 逐条打印事件名与参数这一能力由 TestRunner.ts 实现配合--show-events选项还可以在通过时也打印事件。看不懂日志时Truffle Dashboard 的前后对比视图能帮你把裸字节解码为可读参数5. 性能原理快照回滚机制truffle test并非每个用例都重新部署。测试框架在初始化时执行evm_snapshot打快照每个用例结束后evm_revert回滚到初始状态见 TestRunner.ts。因此支持快照的本地链Ganache、Hardhat Network一次部署全程秒级不支持快照的网络自动退化为每次重新迁移部署6. 上手检查清单✅ 测试文件放在test/目录命名为*.js或*.ts✅ 用artifacts.require而非手动读 build 目录✅ 只读操作一律加.call()避免无谓 Gas✅ 断言附带中文提示语失败日志一目了然✅ 在本地测试网develop网络运行享受快照加速⚠️ 提示Truffle Suite 已进入维护/退役阶段见仓库首页说明新项目建议评估迁移方案但已有的 Truffle 项目本文的 MochaChai 测试模式依然完全适用。核心模块路径速查测试框架实现packages/test/src/TestRunner.ts测试入口导出packages/test/src/index.ts断言工具packages/expect/src/index.ts完整测试示例packages/truffle/test/sources/external_compile/test/metacoin.js【免费下载链接】truffle:warning: The Truffle Suite is being sunset. For information on ongoing support, migration options and FAQs, visit the Consensys blog. Thank you for all the support over the years.项目地址: https://gitcode.com/gh_mirrors/tr/truffle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

别死磕语法,拆解 youtudou 源码才是面试必问的加分项

别死磕语法,拆解 youtudou 源码才是面试必问的加分项

别死磕语法,拆解 youtudou 源码才是面试必问的加分项 学会语法却不知怎么搭项目,这是很多开发者卡在半路的真实困境。你背熟了 Python…

2026/9/21 18:52:40 阅读更多 →
3个技巧搞定大象公会版本升级,实战项目不踩坑

3个技巧搞定大象公会版本升级,实战项目不踩坑

3个技巧搞定大象公会版本升级,实战项目不踩坑 版本升级后 API 全变了,这是每个开发者在维护老项目时最头疼的事。我在一个电商后台的实战项目中,就因为一次底层框架的强制更新,导致核心业务逻辑崩溃了三天。很多学员问,为什么大厂面试总爱问这种“…

2026/9/21 18:51:40 阅读更多 →
discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理

discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理

discord.py 内部架构揭秘:Gateway 分片、429 速率限制与事件循环的代码实现原理 【免费下载链接】discord.py An API wrapper for Discord written in Python. 项目地址: https://gitcode.com/gh_mirrors/di/discord.py discord.py 是 Python 社区最流行的 D…

2026/9/21 18:51:40 阅读更多 →

最新新闻

Voyager 仓库贡献避坑指南:从 PR 机制到插件系统的全链路实战手册

Voyager 仓库贡献避坑指南:从 PR 机制到插件系统的全链路实战手册

Voyager 仓库贡献避坑指南:从 PR 机制到插件系统的全链路实战手册 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、C…

2026/9/21 19:15:53 阅读更多 →
CoffeeScript 2.0.0-beta1 变更详解:解构输出、Literate Markdown 解析与 get/set 调用约束

CoffeeScript 2.0.0-beta1 变更详解:解构输出、Literate Markdown 解析与 get/set 调用约束

CoffeeScript 2.0.0-beta1 变更详解:解构输出、Literate Markdown 解析与 get/set 调用约束 【免费下载链接】coffeescript Unfancy JavaScript 项目地址: https://gitcode.com/gh_mirrors/co/coffeescript 本篇以 2.0.0-beta1.md 为主线,系统梳理…

2026/9/21 19:15:53 阅读更多 →
Flutter与鸿蒙跨平台开发实战:拍照翻译应用优化

Flutter与鸿蒙跨平台开发实战:拍照翻译应用优化

1. 项目背景与核心价值这个项目本质上是在解决一个非常实际的痛点:如何用一套代码同时覆盖鸿蒙和主流移动平台。Flutter作为Google推出的跨平台框架,其"一次编写,多端运行"的特性与鸿蒙系统的分布式能力结合,会产生奇妙…

2026/9/21 19:15:53 阅读更多 →
3个坑让你放弃智慧消防:手写实现避坑指南

3个坑让你放弃智慧消防:手写实现避坑指南

3个坑让你放弃智慧消防:手写实现避坑指南 配置环境就卡半天,是不是你也觉得智慧消防项目离自己很远?别急着划走,很多后端开发者在接这类需求时,第一反应就是“这得搞套复杂的物联网中台吧”。其实不然,核心逻辑完全可以 手写实现…

2026/9/21 19:15:53 阅读更多 →
ESP8266 FSBrowser 示例深度解析:基于 ESP8266WebServer 的跨文件系统 Web 文件管理器

ESP8266 FSBrowser 示例深度解析:基于 ESP8266WebServer 的跨文件系统 Web 文件管理器

ESP8266 FSBrowser 示例深度解析:基于 ESP8266WebServer 的跨文件系统 Web 文件管理器 【免费下载链接】Arduino ESP8266 core for Arduino 项目地址: https://gitcode.com/gh_mirrors/ard/Arduino 导读 本文围绕 Arduino 生态下 ESP8266 core 仓库中的 FSB…

2026/9/21 19:15:53 阅读更多 →
安卓手机跑Linux桌面:Termux+VNC+XFCE完整指南

安卓手机跑Linux桌面:Termux+VNC+XFCE完整指南

有一次出差,电脑落在公司工位上,手边只剩一部旧安卓手机。偏偏那晚需要看一份带图表的工作日志,手机上装了 Termux,能敲命令,却怎么也看不到图形界面。我花了一晚上把 Termux、VNC、XFCE 这三个组件串起来,…

2026/9/21 19:14:52 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →