Mocha жалуется на done (), даже если он используется - PullRequest
0 голосов
/ 20 сентября 2019

Я пишу несколько тестов Solidity с использованием модуля Mocha.Приведенный ниже тест завершается с этой ошибкой, несмотря на то, что вызывается функция done () и обещание разрешается (закомментированные операторы console.log () показывают, что Promise из включенного модуля compile.js действительно разрешается).Возможно, я неправильно интерпретирую ошибку?Я новичок в Node.js, поэтому мои извинения, если я приготовил беспорядок.

1) "before each" hook for "Deploy a contract": Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

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);
   });
});

Функция generate (), импортированная из compile.js, возвращает обещание

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


module.exports = generate;

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Вы не можете использовать обратный вызов done с асинхронной функцией в Mocha.Кроме того, не рекомендуется передавать асинхронную функцию в .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'});
});
0 голосов
/ 20 сентября 2019

Я думаю, что mocha может сойти с ума, потому что вам нужно вручную закрыть ваше соединение web3 после запуска ваших тестов.Попробуйте позвонить disconnect после выполнения тестов:

after(done => {
  web3.currentProvider.disconnect()
  done();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...