Ejercicio: Prueba del contrato inteligente

Completado

En esta parte, escribiremos una nueva prueba de JavaScript para nuestro contrato de envío. En su lugar, podríamos usar Solidity para escribir la prueba, pero JavaScript se usa con más frecuencia. Para probar nuestro contrato inteligente, usaremos Truffle.

Inicio de las pruebas

Comencemos por crear un archivo de prueba.

  1. En el panel Explorador, mantenga el puntero sobre la carpeta test y haga clic con el botón derecho. Elija Nuevo archivo y cree un archivo denominado TestShipping.js.

  2. Copie y pegue el código siguiente en el archivo de prueba:

    const ShippingStatus= artifacts.require("./Shipping.sol");
    contract('Shipping', () => {
    
      it("should return the status Pending", async ()=> {
        // Instance of our deployed contract
        const instance = await ShippingStatus.deployed();
        // Checking the initial status in our contract
        const status = await instance.Status();
        // Checking if the status is initially Pending as set in the constructor
        assert.equal(status, "Pending");
      });
    it("should return the status Shipped", async ()=> {
    // Instance of our deployed contract
        const instance = await ShippingStatus.deployed();
    
        // Calling the Shipped() function
        await instance.Shipped();
    
        // Checking the initial status in our contract
        const status = await instance.Status();
    
        // Checking if the status is Shipped
        assert.equal(status, "Shipped");
      });
    
        it("should return the status Delivered", async ()=> {
    
        // Instance of our deployed contract
        const instance = await ShippingStatus.deployed();
    
        // Calling the Shipped() function
        await instance.Delivered();
    
        // Checking the initial status in our contract
        const status = await instance.Status();
    
        // Checking if the status is Delivered
        assert.equal(status, "Delivered");
      });
    });
    

Prueba de eventos

Usaremos el paquete truffle-assertions para probar los eventos que se envían en el contrato. Con este paquete, podemos afirmar que los eventos se emiten durante la transacción.

  1. En el terminal, instale la biblioteca escribiendo npm install truffle-assertions.

  2. Agregue el código siguiente al archivo de prueba en la línea 2, después de que se requiera el contrato ShippingStatus:

    const truffleAssert = require('truffle-assertions');
    
  3. Agregue una prueba para confirmar que el evento devuelve la descripción esperada. Coloque esta prueba después de la última prueba del archivo. Agréguelo en una nueva línea, justo antes del conjunto de llaves de cierre de la última línea.

      it('should return correct event description', async()=>{
    
        // Instance of our deployed contract
        const instance = await ShippingStatus.deployed();
    
        // Calling the Delivered() function
        const delivered = await instance.Delivered();
    
        // Check event description is correct
        truffleAssert.eventEmitted(delivered, 'LogNewAlert', (event) =>{
          return event.description == 'Your package has arrived';
        });
      });
    
    

Uso de async/await

La función .deployed() devuelve una promesa. Por tanto, usaremos await delante de la función y async delante del código de prueba. Con esta configuración, una vez implementado el contrato, no continuaremos con nuestra prueba hasta que se cumpla el compromiso.

Este patrón se usa normalmente en las pruebas porque casi todas las transacciones de contrato inteligentes son asincrónicas. Y son asincrónicas porque las transacciones deben validarse o extraerse antes de que se agreguen al libro de contabilidad de cadenas de bloques.

En general, debería aspirar a una cobertura de pruebas del 100 % en el contrato, especialmente si planea implementarlo en la red principal de Ethereum o en la red principal.

Ejecutar la prueba

En el terminal, escriba:

truffle test

Debería ver que todas las pruebas se superan correctamente:

  Contract: HelloBlockchain
    ✓ testing ResponseMessage of HelloBlockchain
    ✓ testing Responder of HelloBlockchain
    ✓ testing RequestMessage of HelloBlockchain
    ✓ testing State of HelloBlockchain
    ✓ testing Requestor of HelloBlockchain
    ✓ testing SendRequest of HelloBlockchain (51ms)
    ✓ testing SendResponse of HelloBlockchain (46ms)

  Contract: Shipping
    ✓ should return the status Pending
    ✓ should return the status Shipped (59ms)
    ✓ should return the status Delivered (58ms)
    ✓ should return correct event description (39ms)