[英]Non-deterministic exceptions when running truffle tests
我一直在使用他们的测试服务(我相信使用Mocha和Chai)编写自动化测试来测试我在Truffle中的众筹功能。 我很难理解为什么测试会不确定性地失败(即,它们似乎在随机点失败,但有随机例外)。
例如,我运行测试,有时它们都通过了
我运行测试,有时会收到以下错误消息:
✓ deadline is set when beneficiary clicks start
✓ should return a State of 'Funding' after start is clicked (101ms)
✓ should allow someone to invest and record balance
✓ should send 1 ERC20 token to participant (184ms)
✓ softcap should not return reached when amountRaised is smaller
✓ softcap should return reached when amountRaised is bigger
✓ hardcap should not return reached when amountRaised is smaller
✓ hardcap should return reached when amountRaised is bigger
1) should give 1 ETH in change as hard cap was exceeded
> No events were emitted
✓ should return a State of 'Successful' when hardcap reached
✓ beneficiary should be able to withdraw funds
✓ should return a State of 'Finished' when beneficiary has funds
22 passing (2s)
1 failing
1) Contract: Sale should give 1 ETH in change as hard cap was exceeded:
Uncaught AssertionError: deadline was not set after start pressed by beneficiary: expected '0' to not equal 0
at test/2Crowdsale_Test.js:119:14
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
1
truffle(develop)>
/usr/local/lib/node_modules/truffle/build/cli.bundled.js:320098
throw reason;
^
TypeError: Cannot read property 'currentRetry' of undefined
at
/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runner.js:
552:28
at done
(/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js
:295:5)
at
/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js:
359:11
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
这很容易混淆,因为断言与错误消息不匹配-更改断言失败,但是,返回的消息是通过的较早测试的一部分(受益人单击开始时设置了截止日期)。
再次运行测试,我得到:
✓ approves contract by beneficiary
✓ should return a State of 'Not Started' before start is clicked (134ms)
✓ deadline is set when beneficiary clicks start
✓ should return a State of 'Funding' after start is clicked (98ms)
✓ should allow someone to invest and record balance
✓ should send 1 ERC20 token to participant (143ms)
✓ softcap should not return reached when amountRaised is smaller
✓ softcap should return reached when amountRaised is bigger
✓ hardcap should not return reached when amountRaised is smaller
✓ hardcap should return reached when amountRaised is bigger
1) should give 1 ETH in change as hard cap was exceeded
> No events were emitted
2) should return a State of 'Successful' when hardcap reached
Events emitted during test:
---------------------------
Transfer(_from: <indexed>, _to: <indexed>, _value: 5)
FundTransfer(backer: 0xf17f52151ebef6c7334fad080c5704d77216b732, amount: 5000000000000000000, isContribution: true)
reachedSoftCap(recipient: 0x627306090abab3a6e1400e9345bc60c78a8bef57, totalAmountRaised: 6000000000000000000)
---------------------------
✓ beneficiary should be able to withdraw funds
✓ should return a State of 'Finished' when beneficiary has funds
21 passing (2s)
2 failing
1) Contract: Sale should give 1 ETH in change as hard cap was exceeded:
Uncaught AssertionError: deadline was not set after start pressed by beneficiary: expected '0' to not equal 0
at test/2Crowdsale_Test.js:119:14
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
2) Contract: Sale should return a State of 'Successful' when hardcap reached:
Uncaught AssertionError: hardcap was not met when amountRaised was bigger: expected false to equal true
at test/2Crowdsale_Test.js:195:14
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
2
truffle(develop)>
/usr/local/lib/node_modules/truffle/build/cli.bundled.js:320098
throw reason;
^
TypeError: Cannot set property 'state' of undefined
at
/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runner.js:
576:20
at done
(/usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js
:295:5)
at /usr/local/lib/node_modules/truffle/node_modules/mocha/lib/runnable.js:353:11
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
现在,我有了上一条错误消息,现在又出现了另一条错误消息,该错误消息与断言错误不匹配。
我第四次运行测试:
✓ should allow someone to invest and record balance
✓ should send 1 ERC20 token to participant (120ms)
✓ softcap should not return reached when amountRaised is smaller
✓ softcap should return reached when amountRaised is bigger
✓ hardcap should not return reached when amountRaised is smaller
✓ hardcap should return reached when amountRaised is bigger
✓ should give 1 ETH in change as hard cap was exceeded (275ms)
✓ should return a State of 'Successful' when hardcap reached (61ms)
✓ beneficiary should be able to withdraw funds
1) should return a State of 'Finished' when beneficiary has funds
> No events were emitted
22 passing (2s)
1 failing
1) Contract: Sale should return a State of 'Finished' when beneficiary has funds:
AssertionError: State of contract was not 'Finished': expected '4' to equal 6
at test/2Crowdsale_Test.js:243:14
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
与前两个错误完全不同。 由于先前的测试(受益人应该能够提取资金)也使状态等于6的测试也通过了此测试,因此这又一次令人困惑。
每次测试前,我退出松露控制台,从项目中删除我的构建文件夹,重新进入松露控制台并进行测试(这样我就可以假定链已被重置),但是我仍然收到错误,首先我没有通过Dapp对其进行测试时没有得到这些结果,这是没有道理的;其次,每次都不会显示出来,这似乎是随机的,带有随机的错误。
其他人对此有麻烦吗?
这很容易混淆,因为断言与错误消息不匹配-更改断言失败,但是,返回的消息是通过的较早测试的一部分(受益人单击开始时设置了截止日期)。
这是javaScript异步测试的非常典型的结果,无论您是进行以太坊松露测试还是只是前端的纯Karma-Jasmine测试。
我非常有信心在某些规范未正确设置的回调中包含断言。 规范通过是由于缺少调用'done'回调参数的原因,或者是因为您没有在it
调用内正确返回Promise,因此测试只是作为误报通过,忽略了回调内容。
一段时间后,回调中的代码将运行并失败,从而使正在运行的测试失败,但会给出来自其测试的错误消息以及错误的否定值-因为您在错误的测试中遇到了异常,因此它失败了。
这也可能由.catch
语句大量记录已done
调用引起。
当然,也许我错了,而您的问题与Truffle
本身或testrpc
。
如果您是绝对确保所有it
的规格得以妥善处理异步返回-或者一个承诺或打电话done
- ,那么你应该粘贴测试代码,等待更多的反馈:-S
另外,您在测试期间是否将testrpc用作区块链?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.