Testing
部署合約時超時 w/Mocha
開始為合約建構以下測試套件。它在 Remix 上部署得很好。
我收到以下錯誤消息。
1)“部署契約”的“每個之前”掛鉤:錯誤:超過 20000 毫秒的超時。對於非同步測試和鉤子,確保呼叫了“done()”;如果返回 Promise,請確保它已解決。
使用此設置在其他契約上執行此操作沒有太大問題。不知道這裡發生了什麼。我錯過了一些基本的東西嗎?
const assert = require('assert'); const ganache = require('ganache-cli'); const Web3 = require('web3'); const web3 = new Web3(ganache.provider()); const json = require('../build/contracts/Contract.json'); let accounts, contract; const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; beforeEach( async () => { // Get a list of all accounts; accounts = await web3.eth.getAccounts(); console.log('accounts', accounts); const interface = json["abi"]; contract = await new web3.eth.Contract(interface) .deploy({ data: json["bytecode"] }) .send({ from: accounts[0], gas: '3000000' }) console.log('contract', contract); }); describe("Contract", () => { describe("Smoke test", () => { it("deploys a contract", async () => { await assert.ok(contract.options.address); }); }) });
它看起來像是一個 mocha 超時操作,不允許完成智能合約的部署或等待執行結束。您需要擴展 20000 毫秒的預設設置,您可以通過 2 種不同的方式更改它(例如 60000 毫秒):
- 如果您在 package.json 上使用腳本,請在命令中添加 –timeout 選項,例如。
“scripts”: { … “run_test”: “mocha ‘/*.js’ –timeout 60000” … }
- 否則直接在函式腳本上,例如。
beforeEach( async () => { // 獲取所有帳戶的列表; … }).timeout(60000);
您可以添加一個 try/catch 範例來列印錯誤以防萬一。
您缺少 web3 上的選項!試試這個:
const OPTIONS = { defaultBlock: "latest", transactionConfirmationBlocks: 1, transactionBlockTimeout: 5 } const web3 = new Web3(ganache.provider(), null, OPTIONS);