Teste de contrato de solidez mínima com Ganache e Jest

Adrian Li Blocked Desbloquear Seguir Seguindo 30 de dezembro de 2018

Recentemente, enquanto escrevia algumas ferramentas frontend para dapps (fique ligado), encontrei a necessidade de testar rapidamente que minha biblioteca funcionaria com contratos reais de Solidity.

Embora eu sempre recomende os criadores da dapp para começar com um projeto da Truffle, às vezes você precisa de algo um pouco mais leve. Por exemplo, em vez de ter que executar migrações, talvez você queira apenas compilar um contrato inteligente e testá-lo imediatamente.

Não se preocupe, o conjunto de ferramentas Truffle tem você coberto!

Neste tutorial, mostrarei como configurar o teste mínimo inteligente de contrato com Ganache e Jest.

Se você não precisa de uma explicação passo-a-passo, o repositório de exemplo está bem aqui:

adrianmcli / ganache-jest-example
? Teste de contrato de Solidez Mínima com Ganache e Jest – adrianmcli / ganache-jest-example github.com

Apenas três passos

Em essência, existem apenas três coisas que você precisa fazer:

  1. Compile o contrato de Solidity
  2. Gerar um teste "blockchain"
  3. Implante o contrato.

Soa assustador mesmo? Mas graças a Truffle e à comunidade em geral, isso é tudo muito mais simples do que você imagina.

Nosso contrato

Antes de começarmos, vamos criar nosso contrato, SimpleStorage.sol :

Este contrato é muito simples, permite obter e definir um inteiro, é isso.

Compilando o contrato

Nós vamos usar o solc-js para compilar nosso contrato de Solidity. Isso significa que teremos que nos conformar com a maneira de fazer as coisas e isso pode ficar um pouco estranho, então vamos criar um novo arquivo para isso.

Inicie um novo arquivo chamado compile.js e cole o seguinte:

Estamos exportando uma compile função que irá receber um nome de arquivo e procurá-lo na mesma pasta. Passamos o solc ao objeto options (ie input ) da maneira que ele quer e ele mostra um JSON do qual podemos extrair nosso artefato.

Note que eu também tenho uma versão do solc usando truffle-compile vez de solc . Há prós e contras para qualquer um, sinta-se livre para fazer seu próprio julgamento.

Gerando um blockchain de teste com Ganache

Para esta parte e a próxima, estarei explicando os conceitos primeiro e depois mostrarei todo o arquivo onde tudo se encaixa. Então, por favor, preste atenção, eu prometo que vai dar certo!

Gerar um blockchain de teste é muito mais simples do que eu poderia esperar. Literalmente, a única coisa que você precisa fazer é:

 // import Ganache 
const Ganache = require ("ganache-core");
 // gera o provedor "blockchain" de teste 
provedor const = Ganache.provider ();
 // use como você usaria normalmente um provedor 
const web3 = novo Web3 (provedor);
const accounts = aguarda web3.eth.getAccounts ();

O one-liner Ganache.provider() essencialmente faz todo o trabalho pesado para você. Ele basicamente gera um blockchain na memória e fornece o objeto provider para interagir com ele.

Do provedor, podemos obter facilmente a instância web3 e, posteriormente, o array de accounts que precisaremos na próxima etapa.

Implante seu contrato

Agora que temos o web3, bem como o artefato do contrato, podemos implementá-lo em nosso blockchain de teste.

 const instance = new web3.eth.Contract (SimpleStorage.abi); 
 const deployedInstance = await instance.deploy ({ 
dados: SimpleStorage.evm.bytecode.object
}).mandar({
de: accounts [0],
gás: 150000
});

Este é o uso padrão da API Web3.js (v1.0). Primeiro criamos nossa instância de contrato passando a ABI pelo nosso artefato SimpleStorage.abi . Em seguida, implantamos chamando .deploy() com o bytecode de nosso artefato de contrato e, finalmente, send() de nossa conta com uma quantidade de gás especificada para garantir que ela passe.

Colocando tudo junto

Agora que entendemos o que precisamos fazer, podemos criar um novo arquivo chamado test.js e começar a escrever nosso teste. A maior parte do que conversamos é sobre como configurar o ambiente para nossos testes, então ele irá para o beforeAll() do Jest.

Neste momento, vou mostrar-lhe a totalidade deste arquivo:

Observe que as web3 provider , web3 , accounts e contractInstance são declaradas fora do gancho beforeAll() para que possamos usá-las em nossos testes.

Também temos um afterAll() onde chamamos stop() no provedor para evitar vazamentos de memória.

Por fim, o teste de exemplo real demonstra a configuração e a obtenção de um valor.

Alguns pensamentos

É claro que isso pode ficar um pouco desajeitado se você tiver muitos contratos diferentes e eles herdarem um do outro. Para esses casos de uso, eu recomendo um projeto tradicional de trufas.

No entanto, se você tiver algo simples para testar ou se quiser testar seu frontend separadamente do seu projeto Truffle, essa é uma ótima opção que permite fazer isso.

Tenha em mente que gerar um provedor Ganache leva alguns segundos, então tente não fazer isso por todo o lugar. Se você começar a fazer isso, pode ser outro sinal de que você deve considerar a conversão de seu projeto para um projeto completo da Truffle.

Este formato pode não ser para todos, então confira o repositório de exemplo que você pode clonar e executar por si mesmo!

adrianmcli / ganache-jest-example
? Teste de contrato de Solidez Mínima com Ganache e Jest – adrianmcli / ganache-jest-example github.com

Se você gostou deste artigo, por favor me dê algumas palmas!