Testing

部署合約時超時 w/Mocha

  • September 4, 2020

開始為合約建構以下測試套件。它在 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);

引用自:https://ethereum.stackexchange.com/questions/71827