Деструктуризация массива вернулась из обещаний, которые не работают, как ожидалось - PullRequest
0 голосов
/ 01 января 2019

Я использую Мокко и Чай для написания тестов для умного контракта, развернутого в блокчейне разработки с трюфелем.

У меня есть контракт с именем Electionкоторый содержит два кандидата.

Код теста выглядит следующим образом:

it("Checking the properties for candidates", () => {
    return Election.deployed().then((app) => {
      return [app.candidates(1), app];
    }).then(params => {
      const [candidate1, app] = params;
      assert.equal(candidate1.id, 0);
      return [app.candidates(1), app];
    }).then(params => {
      const [candidate2, app] = params;
      assert.equal(candidate2.id, 1);
    });
  });

Тесты проходят, когда я не использую деструктуризацию массива для возврата app.candidates() и экземпляр app.В этом случае мне пришлось объявить глобальную переменную, присвоить ее app и использовать в каждой области видимости.Но я хочу избежать определения глобальной переменной.Я наткнулся на этот пост на SO, который предлагает использовать ES6 деструктуризацию.

Но здесь я получаю candidate1.id и candidate2.id как undefined.

Что я здесь не так делаю?

1 Ответ

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

Почему вы возвращаетесь с it?Это не нужно, они должны только генерировать.

Я настоятельно рекомендую избегать этого синтаксиса .then и npm i chai-as-promised --save-dev, а затем установить его так:

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');

// Must install Chai as Promised last - https://github.com/domenic/chai-as-promised/#node
chai.use(chaiAsPromised);

// Disable object truncating - https://stackoverflow.com/a/23378037/1828637
chai.config.truncateThreshold = 0;

global.expect = chai.expect;

Тогда вы сделаете:

it("Checking the properties for candidates", async () => {
    expect(Election.deployed()).to.eventually.satisfy(app => app.candidates(1).id === 0)
        and.satisfy(app => app.candidates(2).id === 1);
});

Если app.candidates возвращает обещание, может быть, даже может сделать это, хотя я не уверен насчет асинхронной функции для аргумента satisfy.

it("Checking the properties for candidates", async () => {
    expect(Election.deployed()).to.eventually.satisfy(async app => {
        await expect(app.candidates(1)).to.eventually.be.an('object').that.has.property('id', 0);
        await expect(app.candidates(2)).to.eventually.be.an('object').has.property('id', 1);
    });
});
...