2017-11-28 1 views
0

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?

Antwort

1
  • Dies ist verwirrend, da die Assertion nicht die Fehlermeldung überein - die Änderung Assertion der Nachricht jedoch nicht, dass ein Teil eines früheren Tests zurückgegeben wird, ist die (festgelegte Frist, wenn Empfänger Klicks starten) übergeben .

Dies ist sehr typisch für javaScript asynchrone Prüfung, ob Sie Astraleum Trüffel Tests machen oder einfach nur Karma-Jasmin testet Fom das Front-End.

Ich bin ziemlich sicher, dass Sie in Callbacks Behauptungen in einigen Spezifikationen haben, die nicht richtig festgelegt sind. Die Spezifikation wird aufgrund des fehlenden Aufrufs des Callback-Parameters 'done' oder weil Sie eine Promise nicht ordnungsgemäß innerhalb des Aufrufs it zurückgeben, übergeben, so dass der Test als falsch-positiv übergeben wird und der Rückrufinhalt ignoriert wird.

Einige Zeit später wird der Code innerhalb des Callbacks ausgeführt und schlägt fehl, wodurch der laufende Test fehlschlägt, aber die Fehlermeldung aus seinem Test ausgegeben wird, und ein falscher negativer Wert, da Sie eine Ausnahme im falschen erhalten testen und damit zum Scheitern bringen.

Dies kann auch durch .catch Anweisungen verursacht werden schluckt done Anrufe.

natürlich, vielleicht bin ich nur falsch und Ihr Problem ist in Verbindung mit Truffle selbst, oder mit testrpc.

Wenn Sie absolut sicher sind, dass Sie alle Ihre it Spezifikationen richtig mit Asynchronität handelt -entweder ein Versprechen der Rückkehr oder rufen done -, dann sollten Sie Ihren Testcode einfügen und mehr Feedback warten: -S

Auch verwendest du testrpc während der Tests als deine Blockchain?

+0

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? –

+0

Ja, testrpc ist jetzt automatisch in die truffle develop-Konsole integriert, wie hier beschrieben: https://github.com/trufflesuite/ganache-cli –

+0

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

Verwandte Themen