Saltar al contenido principal

Pruebas

Depuración de 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 con tu contrato directamente usando llamadas a funciones. Si intentas este enfoque, descubrirás que no siempre funciona. Las interacciones de llamadas a funciones no configuran el entorno en el estado correcto para la ejecución del contrato, por lo que las funciones que implican datos del contrato y determinar el contrato actual o invocarlo no funcionarán.

Al escribir pruebas, es importante siempre interactuar con contratos a través de la invocación del contrato. En un entorno de producción, la invocación del contrato ejecutará bytecode Wasm cargado desde el ledger. 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 hacer esto. Todo lo que tienes que hacer es escribir un pequeño stub para realmente llamar al código generado, como

test.rs
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. Hay muchas maneras en que estas interfaces podrían 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 solo está disponible si la característica testutils está habilitada.

Ejemplo

Esta maquinaria también se puede usar para probar múltiples contratos juntos. Por ejemplo, la prueba del contrato de oferta única crea un token.