Ejercicio: Prueba del contrato inteligente
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.
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.
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.
En el terminal, instale la biblioteca escribiendo
npm install truffle-assertions
.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');
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)