
fuels-ts 集成测试中如何用 launchTestNode 启动测试节点并配置自定义快照【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts在 fuels-ts 的集成测试里每个测试用例往往需要一个干净、可预期的链环境。launchTestNode从fuels/test-utils导入就是干这件事的工具它启动一个短生命周期的fuel-core节点顺带创建 provider、生成测试钱包、部署合约最后把节点交给你的测试代码。默认情况下它使用当前 testnet 网络迭代的快照当测试需要不同的链配置时可以通过DEFAULT_CHAIN_SNAPSHOT_DIR环境变量指定自定义快照目录让节点基于你的快照启动。下面以 Node.js 测试环境为例覆盖三件事启动节点并正确释放、用环境变量配置自定义快照、以及如何验证快照确实生效。准备条件在测试文件中从fuels/test-utils引入工具函数import { launchTestNode } from fuels/test-utils;如果需要部署 typegen 生成的合约还要引入合约工厂类pnpm fuels typegen的输出import { WalletUnlocked, Provider } from fuels; import { launchTestNode, TestAssetId, TestMessage } from fuels/test-utils;注意typegen 输出的工厂类导入路径取决于你的目录结构。文档示例中写的是../../../typegend/contracts/CounterFactory你需要按自己项目的实际位置调整。如果想用 TypeScript 5.2 的using声明让节点自动清理tsconfig.json需要满足三个条件TypeScript 版本5.2以上、编译目标es2022或更低、lib包含esnext或esnext.disposable{ compilerOptions: { target: es2022, lib: [es2022, esnext.disposable] } }启动测试节点并获取返回值最小用法就是一行using launched await launchTestNode();using声明保证变量离开块作用域时自动调用launched.cleanup()把节点释放掉。返回值包含provider、wallets、contracts和cleanup可以按需解构using launchedContractNode await launchTestNode({ contractsConfigs: [CounterFactory], }); const { contracts: [contract], provider, wallets, } launchedContractNode; const { waitForResult } await contract.functions.get_count().call(); const response await waitForResult();contractsConfigs传入 typegen 输出的合约工厂类或带factory、walletIndex、options字段的对象节点启动后会自动用生成的钱包完成部署返回的合约类型与 typegen 输出类型一致调用时是类型安全的。如果不能用using比如 TypeScript 版本不够就用普通const接住返回值并在测试结束时手动调用.cleanup()释放节点const launchedTestNode await launchTestNode(); // 运行你的测试逻辑…… launchedTestNode.cleanup();不手动清理的节点不会自动释放这是using不可用时的必做步骤。快照是如何工作的理解自定义快照前先要知道默认行为launchTestNode每次运行都会创建一个临时快照目录和对应配置并把该目录路径通过--snapshot参数传给fuel-core。默认使用的快照是当前 testnet 网络迭代对应的快照仓库中.fuel-core/configs目录下可以看到它的原始内容。用 DEFAULT_CHAIN_SNAPSHOT_DIR 配置自定义快照当默认快照不满足测试需求比如需要不同的链名、共识参数时把DEFAULT_CHAIN_SNAPSHOT_DIR环境变量指向你的快照目录import { join } from path; const mySnapshotDirPath join( __dirname, ../../../../../../, .fuel-core, configs ); process.env.DEFAULT_CHAIN_SNAPSHOT_DIR mySnapshotDirPath; const launchedWithCustomChainConfig await launchTestNode(); const { provider: providerWithCustomChainConfig } launchedWithCustomChainConfig; const { name } await providerWithCustomChainConfig.fetchChain(); launchedWithCustomChainConfig.cleanup();上面路径指向的是仓库自带的默认 testnet 快照目录属于文档示例实际使用时应替换为你自己的快照目录绝对路径或相对路径。从 launch-test-node.ts 的实现可以看出指定该环境变量后launchTestNode会从快照目录中读取三个文件metadata.json快照元数据由metadata.chain_config字段指向的链配置 JSON由metadata.table_encoding.Json.filepath字段指向的状态文件。也就是说你的自定义快照目录必须按同样的结构组织一个metadata.json加上一份链配置和一份状态文件。三者会被组装成快照配置与默认快照一样接入后续全部功能钱包生成、合约部署等。验证快照生效通过 provider 查询链信息检查返回的链名是否与你的自定义链配置一致const { name } await provider.fetchChain(); // name 应等于自定义链配置中定义的链名仓库的测试 launch-test-node.test.ts 中正是用这种方式验证的生成一条链名为gimme_fuel的自定义链配置设置环境变量后启动节点再断言fetchChain()返回的name等于gimme_fuel。在自定义快照基础上再叠加配置环境变量提供的快照不是终点nodeOptions.snapshotConfig会在其上做深度合并环境变量快照优先读取nodeOptions.snapshotConfig中同名字段覆盖它。例如在自定义快照之上替换链的 base asset idconst [baseAssetId] TestAssetId.random(); const nodeWithCustomBaseAssetId await launchTestNode({ nodeOptions: { snapshotConfig: { chainConfig: { consensus_parameters: { V2: { base_asset_id: baseAssetId.value, }, }, }, }, }, }); nodeWithCustomBaseAssetId.cleanup();验证方式同样是fetchChain()这次检查共识参数const { name, consensusParameters: { baseAssetId: baseAssetIdFromChainConfig }, } await provider.fetchChain();仓库测试 launch-test-node.test.ts 演示了完整组合先用DEFAULT_CHAIN_SNAPSHOT_DIR指定自定义链配置再通过nodeOptions.snapshotConfig覆盖base_asset_id最后断言fetchChain()返回的链名与 base asset id 都与预期一致。nodeOptions这一层 API 文档标注为尚未完全定型后续可能有调整见 test-node-options.md。给 fuel-core 传自定义参数除了快照还可以给fuel-core节点追加启动参数。两种方式在启动前设置DEFAULT_FUEL_CORE_ARGS环境变量空格分隔的参数字符串作用于所有测试通过nodeOptions.args传入优先级高于环境变量。文档示例--tx-max-depth 20表示把交易最大深度设为 20process.env.DEFAULT_FUEL_CORE_ARGS --tx-max-depth 20; // nodeOptions.args will override the above values if provided. const nodeWithCustomArgs await launchTestNode(); const { provider: providerWithCustomArgs } nodeWithCustomArgs; process.env.DEFAULT_FUEL_CORE_ARGS ; nodeWithCustomArgs.cleanup();注意两点测试结束后把环境变量置空避免污染同进程里的其他测试nodeOptions.args提供时会完全覆盖环境变量中的参数而不是追加。fuel-core全部可用参数可以用fuel-core run --help查看。仓库测试 launch-test-node.test.ts 的验证方式是设置--tx-max-depth 20后启动节点再断言(await provider.getNode()).maxDepth.toNumber()等于20。另外launchNode的源码中有一条边界说明如果在args里直接传--snapshot参数指向某个快照目录它会覆盖上面所有快照配置逻辑属于更底层的直连用法。边界与限制两个环境变量都作用于当前进程内的调用且必须在launchTestNode()之前设置用vitest/jest等工具时也可以按测试框架的方式在进程级设置具体位置取决于你的测试工具。自定义快照目录必须包含metadata.json及其指向的链配置、状态文件缺少任一项会导致读取失败。默认快照绑定当前 testnet 网络迭代如果 SDK 版本间迭代更新默认快照内容可能随之变化。节点是短生命周期的测试结束务必cleanup()或依赖using自动释放。继续深入完整选项说明walletsConfig、contractsConfigs、nodeOptions、providerOptionstest-node-options.md快照与 fuel-core 参数说明fuel-core-options.md基础示例basic-example.md实现源码launch-test-node.ts【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考