Ich habe automatisierte Tests geschrieben, um meine Crowdsale-Funktionalität in Truffle mit ihrem Testdienst zu testen (was meiner Meinung nach Mocha und Chai verwendet). Ich habe Schwierigkeiten zu verstehen, warum die Tests nicht deterministisch ausfallen (d. H. Sie scheinen an zufälligen Punkten mit zufälligen Ausnahmen zu versagen).Nicht-deterministische Ausnahmen beim Ausführen von Trüffeltests
Eg/ Ich betreibe meine Tests und manchmal sind sie alle passieren
ich meine Tests laufen und manchmal diese Fehlermeldung erhalten:
✓ 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)
Dies ist verwirrend, da die Assertion nicht die Fehlermeldung überein - Die Änderungsbestätigung schlägt jedoch fehl, die Nachricht, die zurückgegeben wird, ist Teil eines früheren Tests, der bestanden wurde (die Frist wird festgelegt, wenn der Begünstigte auf Start klickt).
die Tests laufen wieder bekam ich:
✓ 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)
ich jetzt die vorherige Fehlermeldung haben, und jetzt eine andere wirft, wenn wieder die Fehlermeldung nicht die Behauptung Fehler überein.
die Tests für ein viertes Mal in Folge bekam ich:
✓ 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)
, die ein völlig andere Fehler an den beiden vorherigen ist. Dieser wiederum ist ebenfalls verwirrend, da der vorherige Test (der Begünstigte sollte Geld abheben können) auch Tests für den Staat gleich 6 und dieser Test besteht.
Jedes Mal vor den Tests verlasse ich die Trüffelkonsole, lösche meinen Build-Ordner aus dem Projekt, betrete erneut die Trüffelkonsole und teste (damit ich davon ausgehen kann, dass die Kette zurückgesetzt wurde), bekomme aber trotzdem Fehler Das macht erstens keinen Sinn, da ich diese Ergebnisse nicht selbst beim Dapp-Test erhalte und zweitens nicht jedes Mal auftauche, es scheint zufällige Zeiten mit zufälligen Fehlern zu geben.
Hat sonst noch jemand Probleme damit?
Ich hatte den Eindruck, dass Sie entweder Callbacks oder Versprechen in den Tests und nicht beide zusammen verwenden sollten, wie von der Mocha-Dokumentation hier https://mochajs.org/#hooks zitiert. Daher habe ich done() nirgendwo implementiert, da meine .then() - Funktionen warten sollten, bis das Versprechen zurückgegeben wird, oder? Das macht jedoch insgesamt Sinn, warum die Assertionsfehler Fehler von vorausgehenden Tests ergeben, aber würden sie nicht jedes Mal die gleichen Fehler zurückgeben? –
Ja, testrpc ist jetzt automatisch in die truffle develop-Konsole integriert, wie hier beschrieben: https://github.com/trufflesuite/ganache-cli –
Ich sprach über die Verwendung von done() oder die Rückgabe von Versprechen, weil ich nicht wusste was war deine Wahl. Nur die Rückgabe von Versprechen ist völlig in Ordnung. – Sergeon