NodeJS Mocha抱怨done(),即使使用了它

b1uwtaje  于 2023-01-20  发布在  Node.js
关注(0)|答案(2)|浏览(112)

我正在使用Mocha模块编写Solidity的一些测试。尽管调用了done()函数并解决了promise,但测试失败并出现了以下错误(注解掉的console.log()语句显示包含的模块compile.js中的Promise确实解决了)。也许我没有正确解释错误?我是Node.js的新手,所以如果我弄得一团糟,我很抱歉。
1.“部署合同”的“before each”钩子:
错误:超时超过2000 ms。对于异步测试和钩子,请确保调用了“done()”;如果返回承诺,确保其得到解决。

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');

const web3 = new Web3(ganache.provider());

let accounts;
let inbox;

beforeEach(async (done) => {
  // Get a list of all accounts
  accounts = await web3.eth.getAccounts();
  // console.log(accounts);
  
  const generate = require('../compile');
  await generate()
  .then(async data => {
    var interface = data.interface;
    var bytecode = data.bytecode;

    // console.log('ABI ' + interface);
    // console.log('BIN ' + bytecode);
    inbox = await new web3.eth.Contract(JSON.parse(interface))
            .deploy({data: bytecode, arguments: ['Greetings!']})
            .send({from: accounts[0], gas: '1000000'});
  });
  done();
});

describe('Inbox testing', () => {
   it('Deploy a contract', () => {
     console.log('Contract ' + inbox);
   });
});

从compile.js导入的函数generate()返回promise

function generate() {
  return new Promise((resolve, reject) => {
    ...
    })
  })
}

module.exports = generate;
c9qzyr3d

c9qzyr3d1#

在Mocha中,不能将done回调函数与异步函数一起使用。另外,将异步函数传递给.then也不是一个好主意。我将重构测试函数以仅使用异步样式代码。

beforeEach(async () => {
  // Get a list of all accounts
  const accounts = await web3.eth.getAccounts();
  // console.log(accounts);

  const generate = require('../compile');
  const data = await generate();
  var interface = data.interface;
  var bytecode = data.bytecode;

  // console.log('ABI ' + interface);
  // console.log('BIN ' + bytecode);
  inbox = await new web3.eth.Contract(JSON.parse(interface))
          .deploy({data: bytecode, arguments: ['Greetings!']})
          .send({from: accounts[0], gas: '1000000'});
});
ggazkfy8

ggazkfy82#

我认为mocha可能会发疯,因为您需要在运行测试后手动关闭web3连接。请尝试在运行测试后调用disconnect

after(done => {
  web3.currentProvider.disconnect()
  done();
}

相关问题