我正在使用Mocha和Chai编写针对松露部署在开发区块链上的智能合约的测试。
我有一个名为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.id
和candidate2.id
都设为undefined
。
我在这里做什么错了?
答案 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);
});
});