Недетерминированные исключения при выполнении трюфельных тестов
Я писал автоматические тесты для проверки моей краудсейл-функциональности в Truffle, используя их сервис тестирования (который, я считаю, использует Mocha и Chai). У меня возникают проблемы с пониманием того, почему тесты не проходят недетерминированно (то есть, кажется, что они проваливаются в случайных точках со случайными исключениями).
Например, я запускаю свои тесты, и иногда они все проходят
Я запускаю свои тесты и иногда получаю это сообщение об ошибке:
✓ 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)
Это сбивает с толку, так как Утверждение не соответствует сообщению об ошибке - однако изменение assert не удается, возвращаемое сообщение является частью более раннего пройденного теста (крайний срок устанавливается, когда начинаются щелчки получателя).
Запустив тесты снова я получил:
✓ 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 и, во-вторых, не появляется каждый раз, кажется, что это случайные времена со случайными ошибками.
У кого-нибудь еще были проблемы с этим?
1 ответ
Это сбивает с толку, так как Утверждение не соответствует сообщению об ошибке - однако изменение assert не удается, возвращаемое сообщение является частью более раннего пройденного теста (крайний срок устанавливается, когда начинаются щелчки получателя).
Это очень типично для асинхронного тестирования javaScript, когда вы проводите тесты ethereum трюфель или просто тесты Karma-Jasmine из внешнего интерфейса.
Я вполне уверен, что у вас есть утверждения в обратных вызовах в некоторых спецификациях, которые не установлены должным образом. Передача спецификации из-за отсутствия вызова параметра обратного вызова done или из-за неправильного возврата Promise внутри it
вызов, так что тест просто пройти как ложное срабатывание, игнорируя содержимое обратного вызова.
Некоторое время спустя код внутри обратного вызова запускается и дает сбой, что приводит к сбою работающего теста, но дает сообщение об ошибке из его теста и ложный отрицательный результат, так как вы получаете исключение в неправильном тесте, таким образом делая это потерпеть неудачу.
Это может быть вызвано также .catch
гадости на заявления done
звонки.
конечно, может я просто ошибаюсь и твоя проблема тесно связана с Truffle
сам или с testrpc
,
Если вы абсолютно уверены, что все ваши it
спецификации имеют дело с асинхронностью - либо возвращение обещания, либо вызов done
-, тогда вы должны вставить свой тестовый код и ждать больше отзывов:-S
Кроме того, вы используете testrpc в качестве блокчейна во время тестов?