Promise-Verkettung in der Datei test.js

  it("should throw an exception if you try to buy an article that does not exist", function() {
    return ChainList.deployed().then(function(instance) {
        chainListInstance = instance;
        return chainListInstance.sellArticle(articleName, articleDescription, web3.toWei(articlePrice, "ether"), {
          from: seller
        });
      }).then(function(receipt) {
        return chainListInstance.buyArticle(2, {
          from: buyer,
          value: web3.toWei(articlePrice, "ether")
        });
      }).then(assert.fail)
      .catch(function(error) {
        assert(error.message.indexOf('invalid opcode') >= 0, "error message must contain invalid opcode");
      }).then(function() {
        return chainListInstance.articles(articleId);
      }).then(function(data) {
        assert.equal(data[0].toNumber(), articleId, "article id must be " + articleId);
        assert.equal(data[1], seller, "seller must be " + seller);
        assert.equal(data[2], 0x0, "buyer must be empty");
        assert.equal(data[3], articleName, "article name must be " + articleName);
        assert.equal(data[4], articleDescription, "article description must be " + articleDescription);
        assert.equal(data[5].toNumber(), web3.toWei(articlePrice, "ether"), "article price must be " + web3.toWei(articlePrice, "ether"));
      });
  });

1) Dies ist die eine der Testdateien, die ich für meinen Code für die SellArticle-Funktion gesehen habe, an der ich gearbeitet habe

2) Nach meiner Kenntnis führt die Versprechenkette durch die Ausgabe des ersten Versprechens zum nächsten

3) Und es wartet, bis das Versprechen abgeschlossen ist, bis es an diesem Punkt bleibt

4) .then(assert.fail) wie kann es zum nächsten Schritt übergehen, wenn es keinen Fehler gibt und Kettensprung versprechen kann

Bitte korrigieren Sie mich, wenn ich falsch liege

Antworten (2)

Das Testen erwarteter Ausnahmen ist schwierig, aber auch sehr wichtig, damit Sie bestätigen können, dass der Vertrag alle unangemessenen Anfragen ablehnt.

Möglicherweise finden Sie dieses Dienstprogramm nützlicher. Xavier hat einige subtile Verhaltensunterschiede zwischen geth und ganache-cli (testRPC) in einem Modul behoben, das Sie importieren können. Es erleichtert einen viel besser lesbaren Test.

https://gist.github.com/xavierlepretre/d5583222fde52ddfbc58b7cfa0d2d0a9

Deins wäre ungefähr so:

it("should throw an exception if you try to buy an article that does not exist", function() {

  return expectedExceptionPromise(function () {
    return chainListInstance.sellArticle(
      articleName, 
      articleDescription, 
      web3.toWei(articlePrice, "ether"), 
        { from: accounts[0], value: 1, gas: 3000000 });
        }, 3000000);

    });
  });
});

Der Test wird sich beschweren , es sei denn, der Rückgabewert ist eine Ausnahme.

Sie werden vielleicht bemerken, dass ich den neuen Vertragsschritt ausgearbeitet habe. A beforeEachkann helfen, jeden Test zu einem guten Start zu bringen. Zum Beispiel einrichten chainListInstance.

Ich hoffe es hilft.

Normalerweise finde ich die Verwendung von async/await anstelle von Versprechensketten viel lesbarer und leichter zu verstehen. Um einen Transaktionsfehler zu behaupten, können Sie auch meine Truffle-Assertions-Bibliothek verwenden, die eine spezielle Funktion dafür hat.

Es kann mit npm installiert werden:

npm install truffle-assertions

Und dann am Anfang Ihrer Datei importiert:

const truffleAssert = require('truffle-assertions');

Wenn Sie sowohl async/await als auch truffle-assertions verwenden, könnten Sie Ihren Code durch den folgenden ersetzen, der viel prägnanter ist.

it("should throw an exception if you try to buy an article that does not exist", async () => {
  let chainListInstance = await ChainList.deployed();
  let receipt = await chainListInstance.sellArticle(articleName, articleDescription, web3.toWei(articlePrice, "ether"), { from: seller });

  truffleAssert.fails(
    chainListInstance.buyArticle(2, { from: buyer, value: web3.toWei(articlePrice, "ether") }),
    truffleAssert.ErrorType.INVALID_OPCODE
  );

  let data = await chainListInstance.articles(articleId);

  assert.equal(data[0].toNumber(), articleId, "article id must be " + articleId);
  assert.equal(data[1], seller, "seller must be " + seller);
  assert.equal(data[2], 0x0, "buyer must be empty");
  assert.equal(data[3], articleName, "article name must be " + articleName);
  assert.equal(data[4], articleDescription, "article description must be " + articleDescription);
  assert.equal(data[5].toNumber(), web3.toWei(articlePrice, "ether"), "article price must be " + web3.toWei(articlePrice, "ether"));
});