encadenamiento de promesas en el archivo 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) Este es uno de los archivos de prueba que he visto para mi código para la función SellArticle que he trabajado

2) De acuerdo con mi conocimiento, la cadena de promesas se ejecuta por la salida dada por la primera promesa a la siguiente

3) Y espera a que se complete la promesa hasta entonces se queda en ese punto

4) .then (assert.fail) ¿cómo puede pasar al siguiente paso si no hay ningún error y puede prometer el salto de la cadena?

por favor corrígeme si me equivoco

Respuestas (2)

Probar las excepciones esperadas es complicado pero también muy importante para que pueda confirmar que el contrato rechaza todas las solicitudes inapropiadas.

Puede encontrar esta utilidad más útil. Xavier ha resuelto algunas diferencias sutiles en el comportamiento entre geth y ganache-cli (testRPC) en un módulo que puedes importar. Facilita una prueba mucho más legible.

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

El tuyo sería algo como:

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);

    });
  });
});

La prueba se quejará a menos que el valor de retorno sea una excepción.

Podrías notar que forjé el paso del nuevo contrato. A beforeEachpuede ayudar a que cada prueba tenga un buen comienzo. Por ejemplo, configurar chainListInstance.

Espero eso ayude.

Por lo general, encuentro que usar async/await en lugar de cadenas de promesas es mucho más legible y fácil de entender. Para afirmar una falla en la transacción, también puede usar mi biblioteca de aserciones de trufas, que tiene una función específica para esto.

Se puede instalar con npm:

npm install truffle-assertions

Y luego importó en la parte superior de su archivo:

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

Usando async/await y truffle-assertions, puede reemplazar su código con el siguiente, que es mucho más conciso.

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"));
});