诺言返回的数组解构未按预期运行

时间:2019-01-01 14:27:53

标签: mocha es6-promise chai solidity

我正在使用MochaChai编写针对松露部署在开发区块链上的智能合约的测试。

我有一个名为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并在每个范围中使用它。但是我想避免定义一个全局变量。我在this上看到过有关SO的帖子,该帖子建议使用ES6解构。

但是在这里,我将candidate1.idcandidate2.id都设为undefined

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

您为什么要从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返回一个Promise,甚至可以做到这一点,我不确定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);
    });
});