Javascript Promise выдает ошибку при использовании библиотеки Mocha - PullRequest
0 голосов
/ 09 января 2019
const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');
const inbox = require('../compile');

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

const interface = inbox.interface;
const bytecode = inbox.bytecode;

let contractAddress,inboxContract;
beforeEach(()=>{
    // Get a list of all accounts
   return web3.eth.getAccounts()
        .then(accountList=>{
            contractAddress = Array.from(accountList)[0];
            return contractAddress;
        })
        .then(contractAddress=>{
          inboxContract =  new web3.eth.Contract(JSON.parse(interface))
                .deploy({data: bytecode, arguments:['Hi there!']})
                .send({from: contractAddress, gas: '1000000'});
                return inboxContract;
        })


    //Use one of the accounts to deploy the contract
});

describe('Inbox contract test',()=>{

    it('Successfully Deploy Test',()=>{
        assert.ok(inboxContract.options.address);
    })
    it('Default Value test',()=>{

    })
    it('setMessage Test',()=>{

    })
})

output- Я хочу, чтобы beforeEach полностью выполнить перед запуском блока (). Я что-то упустил здесь, в Promise. В идеале beforeEach () должен завершаться перед выполнением тестовых случаев.

Screenshot-

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

измените свой beforeEach блок со следующим

beforeEach(() => {
    return web3.eth.getAccounts()
        .then(accountList => {
            return Array.from(accountList)[0];
        })
        .then(account => {
            contractAddress = account;
            return new web3.eth.Contract(JSON.parse(interface))
                .deploy({ data: bytecode, arguments: ['Hi there!'] })
                .send({ from: account, gas: '1000000' });
        })
        .then(contract => {
            inboxContract = contract;
        })
});
0 голосов
/ 16 января 2019

код для beforeEach должен быть внутри describe, и тогда вы можете использовать async - await вместо стандартных обещаний, что делает синтаксис более приятным.

это будет выглядеть так

describe('Inbox contract test',()=>{
  const inboxContract =  new web3.eth.Contract(JSON.parse(interface))

  beforeEach(async ()=>{
    // Get a list of all accounts
    const accountList = await web3.eth.getAccounts()
    const contractAddress = Array.from(accountList)[0];
    let receipt = await inboxContract.deploy({data: bytecode, arguments:['Hi there!']})
      .send({from: contractAddress, gas: '1000000'});
    //Use one of the accounts to deploy the contract
    inboxContract.options.address = receipt.contractAddress
  });
...

но вам нужно убедиться, что ваши тесты выполняются inline, потому что глобальная переменная inboxContract будет заменяться перед каждым тестом

...