Unit-Test mit Trüffel, Solidität oder Mokka?

Trüffel erlaubt entweder das eine oder das andere. Jetzt frage ich mich, was ich zum Testen meines Codes verwenden soll. Ich bin kein großer Fan von Mokka. Wenn ich Code wie sehe

contract('MetaCoin', function(accounts) {   it("should put 10000 MetaCoin in the first account", function() {
    return MetaCoin.deployed().then(function(instance) {
      return instance.getBalance.call(accounts[0]);
    }).then(function(balance) {
      assert.equal(balance.valueOf(), 10000, "10000 wasn't in the first account");
    });

Bei der Lesbarkeit ist meiner Meinung nach etwas schief gelaufen. Andererseits ist mir der Gedanke, einen Vertrag zu schreiben, um einen anderen Vertrag zu testen, ziemlich unangenehm. Was sind die Vorbehalte beim Unit-Testing mit diesen zwei unterschiedlichen Ansätzen?

Mocha muss nicht so unlesbar sein, wenn Sie async-Syntax verwenden, werden alle verschachtelten then()-Methoden entfernt und alles abgeflacht.
Was meinst du mit "Festigkeit oder Mokka"? Sie sind nicht wirklich vergleichbar. Was wäre ein Solidity Unit Test?

Antworten (2)

Ich habe mehr als tausend Tests für verschiedene Smart Contracts geschrieben und kann sagen, dass Sie fast immer Javascript/Mocha mit Trüffel verwenden möchten. Es gibt sehr wenige Fälle, auf die ich gestoßen bin, in denen Sie stattdessen Solidity verwenden möchten. Es ist einfach so viel einfacher, Ihre Verträge auf den gewünschten Status einzustellen, um die Tests durchzuführen.

Außerdem ... müssen Sie Funktionsaufrufe wirklich nicht wie im angegebenen Beispiel verketten. Sie können async/await verwenden, was die Dinge VIEL sauberer und lesbarer macht. Ich habe ein Boilerplate-Trüffelprojekt erstellt, das ich für jedes meiner neuen Projekte verwende. Ich halte es mit Beispielen usw. auf dem Laufenden. Ich würde dringend empfehlen, sich anzusehen, wie Tests dort sind ...

Repo:

https://github.com/TovarishFin/smart-contract-boilerplate

direkter Link zu einer Testdatei mit async/await:

https://github.com/TovarishFin/smart-contract-boilerplate/blob/master/test/ExampleCoin.js

Ersetzen: assert.equal(balance.valueOf(), 10000, „10000 war nicht im ersten Konto“);

Mit:

assert.equal(balance.valueOf() === 10000, 1); // Falls wahr, für falsch 1 durch -1 ersetzen