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:
- Compile o contrato de Solidity
- Gerar um teste "blockchain"
- 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!