Pruebas
Depurar contratos explica que es mucho más conveniente depurar usando código nativo que Wasm. Dado que estás probando código nativo, es tentador interactuar directamente con tu contrato usando llamadas a funciones. Si intentas este enfoque, descubrirás que no siempre funciona. Las interacciones mediante llamadas a funciones no configuran el entorno en el estado correcto para la ejecución del contrato, por lo que las funciones que involucran datos del contrato y la determinación del contrato actual o invocador no funcionarán.
Al escribir pruebas, es importante interactuar siempre con los contratos mediante invocación de contratos. En un entorno de producción, la invocación de contratos ejecutará bytecode Wasm cargado desde el libro mayor. ¿Entonces cómo funciona esto si estás probando código nativo? Debes registrar tu contrato con el entorno para que sepa qué funciones están disponibles y cómo llamarlas. Aunque esto suena complejo, el macro procedural contractimpl
genera automáticamente casi todo el código para hacerlo. Todo lo que tienes que hacer es escribir un pequeño stub para llamar realmente al código generado, como
pub fn register_test_contract(e: &Env, contract_id: &[u8; 32]) {
let contract_id = FixedBinary::from_array(e, *contract_id);
e.register_contract(&contract_id, crate::contract::Token {});
}
Algunos contratos, como el contrato de token, también proporcionan una interfaz más amigable para facilitar las pruebas. Existen muchas maneras en que estas interfaces pueden facilitar las pruebas, pero una común es permitir la firma automática de mensajes pasando un ed25519_dalek::Keypair.
Ten en cuenta que todo lo descrito en esta sección sólo está disponible si la característica testutils
está habilitada.
Ejemplo
Esta maquinaria también puede usarse para probar múltiples contratos juntos. Por ejemplo, el caso de prueba del contrato de oferta única crea un token.