Elrond Rust测试框架设置NFT名称后读取返回异常问题
问题描述
使用 elrond-wasm 0.32.0 版本编写智能合约测试用例时,读取 ESDT NFT 名称会出现异常:合约返回 ESDT 代币标识符,而非预先设置的 NFT 名称。
复现步骤
- 调用
set_nft_balance_all_properties方法设置ESDT代币的名称属性,代码如下:
blockchain_wrapper.set_nft_balance_all_properties::<Empty>( &cf_wrapper.address_ref(), &ITEM_TO_EQUIP_ID, ITEM_TO_EQUIP_NONCE, &rust_biguint!(2u64), &Empty, 0, Option::Some(&owner_address), Option::Some(ITEM_TO_EQUIP_NAME), Option::Some(b""), &[], );
- 属性设置完成后,调用
get_esdt_token_data方法读取ESDT代币名称,代码如下:
blockchain_wrapper .execute_query(&cf_wrapper, |sc| { let data = sc.blockchain().get_esdt_token_data( &ManagedAddress::from_address(&cf_wrapper.address_ref()), &TokenIdentifier::from_esdt_bytes(ITEM_TO_EQUIP_ID), ITEM_TO_EQUIP_NONCE, ); // data.name equals ITEM_TO_EQUIP_ID, so it fail assert_eq!(data.name, ManagedBuffer::new_from_bytes(ITEM_TO_EQUIP_NAME)); }) .assert_ok();
- 执行测试时
data.name字段返回值为ITEM_TO_EQUIP_ID(即代币ID),和预期设置的ITEM_TO_EQUIP_NAME不一致,导致断言失败,需要确认问题是操作配置遗漏还是框架本身存在bug。
完整测试代码片段
#[test] fn set_name_test() { const WASM_PATH: &'static str = "sc-customize-nft/output/customize_nft.wasm"; const ITEM_TO_EQUIP_ID: &[u8] = b"ITEM-a1a1a1"; const ITEM_TO_EQUIP_NAME: &[u8] = b"item name"; const ITEM_TO_EQUIP_NONCE: u64 = 1; let rust_zero = rust_biguint!(0u64); let mut blockchain_wrapper = BlockchainStateWrapper::new(); let owner_address = blockchain_wrapper.create_user_account(&rust_zero); let cf_wrapper = blockchain_wrapper.create_sc_account( &rust_zero, Some(&owner_address), customize_nft::contract_obj, WASM_PATH, ); // deploy contract blockchain_wrapper .execute_tx(&owner_address, &cf_wrapper, &rust_zero, |sc| { let result = sc.init(managed_token_id!(PENGUIN_TOKEN_ID)); assert_eq!(result, SCResult::Ok(())); }) .assert_ok(); blockchain_wrapper.add_mandos_set_account(cf_wrapper.address_ref()); blockchain_wrapper.set_nft_balance_all_properties::<Empty>( &cf_wrapper.address_ref(), &ITEM_TO_EQUIP_ID, ITEM_TO_EQUIP_NONCE, &rust_biguint!(2u64), &Empty, 0, Option::Some(&owner_address), Option::Some(ITEM_TO_EQUIP_NAME), Option::Some(b""), &[], ); blockchain_wrapper .execute_query(&cf_wrapper, |sc| { let data = sc.blockchain().get_esdt_token_data( &ManagedAddress::from_address(&cf_wrapper.address_ref()), &TokenIdentifier::from_esdt_bytes(ITEM_TO_EQUIP_ID), ITEM_TO_EQUIP_NONCE, ); println!("Name is {:?}", data.name); assert_eq!(data.name, ManagedBuffer::new_from_bytes(ITEM_TO_EQUIP_NAME)); }) .assert_ok(); }
内容的提问来源于stack exchange,提问作者Fargerik
相关产品推荐
相关产品推荐

