Elrond mandos 测试 elrond_wasm_debug::mandos_rs 通过,但是 erdpy 合约测试失败

发布于 2025-01-12 01:15:00 字数 2750 浏览 3 评论 0原文

我正在为我的 NFT 智能合约 (SC) 编写测试用例。当我在创建 NFT 后检查 SC 的状态时,我期望看到一个要更新的变量(next_index_to_mint:u64,即每个新 NFT 我都会增加 1)。

因此,我使用以下命令运行测试:

$ erdpy contract test
INFO:projects.core:run_tests.project: /Users/<user>/sc_nft
INFO:myprocess:run_process: ['/Users/<user>/elrondsdk/vmtools/mandos-test', '/Users/<user>/sc_nft/mandos'], in folder: None
CRITICAL:cli:External process error:
Command line: ['/Users/<user>/elrondsdk/vmtools/mandos-test', '/Users/<user>/sc_nft/mandos']
Output: Scenario: buy_nft.scen.json ...   FAIL: wrong account storage for account "sc:nft-minter":
  for key 0x6e657874496e646578546f4d696e74 (str:nextIndexToMint): Want: "0x02". Have: ""
Scenario: create_nft.scen.json ...   FAIL: wrong account storage for account "sc:nft-minter":
  for key 0x6e657874496e646578546f4d696e74 (str:nextIndexToMint): Want: "0x02". Have: ""
Scenario: init.scen.json ...   ok
Done. Passed: 1. Failed: 2. Skipped: 0.
ERROR: some tests failed

但是,当我使用 elrond_wasm_debug::mandos_rs 函数和 create_nft.scen.json 文件运行测试时,它通过了。

use elrond_wasm_debug::*;

fn world() -> BlockchainMock {
    let mut blockchain = BlockchainMock::new();
    blockchain.set_current_dir_from_workspace("");

    blockchain.register_contract_builder("file:output/test.wasm", nft_auth_card::ContractBuilder);
    blockchain
}

#[test]
fn create_nft() {
    elrond_wasm_debug::mandos_rs("mandos/create_nft.scen.json", world());
}

顺便说一句,如果您想将其添加到 NFT SC 示例中,那么在 tests/ 文件夹中会很棒。

我尝试输入错误的值,但失败了:预期的。所以我的问题是它怎么可能使用 mandos elrond_wasm 调试而不是 erdpy 工作?

running 1 test
thread 'create_nft' panicked at 'bad storage value. Address: sc:nft-minter. Key: str:nextIndexToMint. Want: "0x04". Have: 0x02', /Users/<user>/elrondsdk/vendor-rust/registry/src/github.com-1ecc6299db9ec823/elrond-wasm-debug-0.28.0/src/mandos_step/check_state.rs:56:21

这是代码(我使用默认的 NFT SC 示例):

const NFT_INDEX: u64 = 0;
fn create_nft_with_attributes<T: TopEncode>(...) -> u64 {
    ...
    self.next_index_to_mint().set_if_empty(&NFT_INDEX);
    let next_index_to_mint = self.next_index_to_mint().get();
    self.next_index_to_mint().set(next_index_to_mint+1);
    ...
}

#[storage_mapper("nextIndexToMint")]
fn next_index_to_mint(&self) -> SingleValueMapper<u64>;

I'm writing test cases for my NFT smart contract (SC). When I check the state of the SC after creating my NFT I'm expecting to see a variable (next_index_to_mint:u64, that's I increase by 1 every new NFT) to be updated.

So I'm running the test using the command:

$ erdpy contract test
INFO:projects.core:run_tests.project: /Users/<user>/sc_nft
INFO:myprocess:run_process: ['/Users/<user>/elrondsdk/vmtools/mandos-test', '/Users/<user>/sc_nft/mandos'], in folder: None
CRITICAL:cli:External process error:
Command line: ['/Users/<user>/elrondsdk/vmtools/mandos-test', '/Users/<user>/sc_nft/mandos']
Output: Scenario: buy_nft.scen.json ...   FAIL: wrong account storage for account "sc:nft-minter":
  for key 0x6e657874496e646578546f4d696e74 (str:nextIndexToMint): Want: "0x02". Have: ""
Scenario: create_nft.scen.json ...   FAIL: wrong account storage for account "sc:nft-minter":
  for key 0x6e657874496e646578546f4d696e74 (str:nextIndexToMint): Want: "0x02". Have: ""
Scenario: init.scen.json ...   ok
Done. Passed: 1. Failed: 2. Skipped: 0.
ERROR: some tests failed

However, when I'm running the test using elrond_wasm_debug::mandos_rs function with the create_nft.scen.json file, it passed.

use elrond_wasm_debug::*;

fn world() -> BlockchainMock {
    let mut blockchain = BlockchainMock::new();
    blockchain.set_current_dir_from_workspace("");

    blockchain.register_contract_builder("file:output/test.wasm", nft_auth_card::ContractBuilder);
    blockchain
}

#[test]
fn create_nft() {
    elrond_wasm_debug::mandos_rs("mandos/create_nft.scen.json", world());
}

BTW, if you want to add this to the NFT SC example, that would be great in the tests/ folder.

I tried to put an incorrect value, and it failed as expected. So my question is how could it be possible that it work using mandos elrond_wasm debug but not erdpy ?

running 1 test
thread 'create_nft' panicked at 'bad storage value. Address: sc:nft-minter. Key: str:nextIndexToMint. Want: "0x04". Have: 0x02', /Users/<user>/elrondsdk/vendor-rust/registry/src/github.com-1ecc6299db9ec823/elrond-wasm-debug-0.28.0/src/mandos_step/check_state.rs:56:21

Here is the code (I use the default NFT SC example):

const NFT_INDEX: u64 = 0;
fn create_nft_with_attributes<T: TopEncode>(...) -> u64 {
    ...
    self.next_index_to_mint().set_if_empty(&NFT_INDEX);
    let next_index_to_mint = self.next_index_to_mint().get();
    self.next_index_to_mint().set(next_index_to_mint+1);
    ...
}

#[storage_mapper("nextIndexToMint")]
fn next_index_to_mint(&self) -> SingleValueMapper<u64>;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酒浓于脸红 2025-01-19 01:15:00

简短回答:很可能在使用 erdpy 测试之前您还没有重新构建合同。

长答案:目前有两种执行 mandos 测试的方式,正如您在案例中所举例说明的那样:

  • 通过 mandos_rs 直接从 rust 运行测试
  • 通过 erdpy (反过来使用 mandos_go)运行测试

这两个框架(mandos_rs 和 mandos_go)以不同的方式运行:

  • mandos_rs:该框架直接在您的 rust 代码 上运行,并且正在对其进行测试反对在后台模拟虚拟机和模拟区块链。因此,使用 mandos_rs 时无需构建合约。
  • mandos_go:这个框架正在测试您的编译合约
    REAL VM 在后台带有模拟区块链,因此有必要在通过 mandos_go 运行测试之前将最新更改构建到 .wasm 字节码中(例如 erdpy 合约构建 ),因为此编译文件将由虚拟机就像在真实的使用场景中一样。

Short answer: most likely you haven't re-built your contract before testing it with erdpy.

Long answer: currently there are two ways mandos tests are executed, as you've exemplified in your case:

  • Run tests directly from rust through mandos_rs
  • Run tests through erdpy (which in turn uses mandos_go)

These two frameworks (mandos_rs and mandos_go) are functioning in different ways:

  • mandos_rs: this framework is running on your rust code directly and it's testing it agains a mocked VM and mocked blockchain in the background. Therefore, it's not necessary to build your contract when using mandos_rs.
  • mandos_go: this framework is testing your compiled contract against a
    REAL VM with mocked blockchain in the background, so it's necessary to build your latest changes into a .wasm bytecode (e.g. erdpy contract build) before running the tests via mandos_go, as this compiled file will be loaded by the VM like in a real use scenario.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文