如何测试 PersistentMap item 是否正确保存到存储?

How to test a PersistentMap item is correctly saved to storage?

我有一个函数,它接受多个值,创建一个新模型,然后通过 PersistentMap.

将其保存在存储中

我想测试项目是否成功保存在存储中。这就是我要解决的问题:

    it("saves a new item to storage", () => {
      VMContext.setCurrent_account_id("test_account_id");

      contract.createMyPersistantMapItem(
        "value 1",
        "value 2",
        "value 3"
      );
   
      expect(storage.hasKey("myPersistantMap::test_account_id")).toBeTruthy();
    });

但是测试失败并显示以下内容:

  [Actual]: false
[Expected]: Truthy
   [Stack]: RuntimeError: unreachable
            at node_modules/@as-pect/assembly/assembly/internal/assert/assert (wasm-function[53]:0xd71)
            at start:src/simple/__tests__/index.unit.spec~anonymous|0~anonymous|0~anonymous|0 (wasm-function[130]:0x2a84)
            at node_modules/@as-pect/assembly/assembly/internal/call/__call (wasm-function[134]:0x2aac)

我是不是做错了?

我也想测试项目中的值是否正确。在 todos example 中,创建的待办事项从创建它的函数返回,然后测试此返回值。这是使测试更容易的最佳方法吗?

编辑

这是 createMyPersistantMapItem 函数 - 进行了一些编辑以使事情更清楚:

export function createMyPersistantMapItem(
    blah1: string,
    blah2: string,
    blah3: string,
  ): void {
    const accountId = context.sender;
  
    assert(
      !storage.hasKey("myPersistantMap::" + accountId),
      "Item already exists"
    );
  
    const newPersistantMapItem = new PersistantMapItem(
      blah1,
      blah2,
      blah3
    );
  
    myPersistantMap.set(accountId, newPersistantMapItem);
  }

关于第一个问题:

myPersistentMap初始化时是否使用“myPersistantMap”前缀? PersistantMapItem 是否在 class 上使用 @nearBingden 注释?

另外,在你的测试中,我认为你应该使用

VMContext.setSigner_account_id("test_account_id") 

//instead of
VMContext.setCurrent_account_id("test_account_id")

因为你调用createMyPersistantMapItem

时使用的是context.sender

关于第二个问题:

In the todos example the created todo is returned from the function that creates it, and then this returned value is tested. Is this the best way of doing things to make testing easier?

这个问题主要是基于意见,所以我只能自己回答。测试返回值是完全没问题的。然而,在智能合约中,我可能会测试该值是否实际存储在合约中。我认为他们在 TODO 示例中就是这么做的。他们只是使用生成的 TODO 的 ID 对智能合约进行查询。

const a = Todo.insert("Drink water");
// They use the id of the todo (a) to check if it was actually stored, and is in fact the same object. I think this is fine.
expect(getById(a.id)).toStrictEqual(a);