首页 > 解决方案 > “TypeError: inst.createZombie(...).send is not a function”用松露测试我的智能合约时

问题描述

我正在使用 truffle 来测试一个用solidity编写的合约,它非常简单,我基本上是在遵循织机教程(加密僵尸)。

这是我在 createzombie.sol 文件中编写的基本功能,

function createZombie() public payable {
  require(msg.value >= feeCreateZombie);
  zombie memory myZombie;
  myZombie.name = "newbie";
  myZombie.dna = uint(keccak256( abi.encodePacked(now,msg.sender))) % 5;
  myZombie.level = 1;
  myZombie.cooldown = now;
  zombieToOwner[zombies.push(myZombie) - 1] = msg.sender;
}

这是我用来测试合同的 javascript 文件:

const createZombie = artifacts.require('createzombie');

contract('basic tests', (accounts) => {

  it('should create a zombie', async () => {

    const inst = await createZombie.new();
    let result = await inst.createZombie({from: accounts[0]}).send();
    assert.equal(result.receipt.status, true);

  });
});

当我在终端中运行 sudo truffle test 时,出现以下错误:

 TypeError: inst.createZombie(...).send is not a function

(我准确地说我是一个完整的初学者)

非常感谢您未来的回答!

编辑:另一个可能相关的问题示例,这是一个非常基本的智能合约的另一个示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.4;

contract Balek {

mapping(uint => address) public deck;

constructor() {
  deck[0] = msg.sender;
}

modifier reallySender(uint _name) {
  require(deck[_name] == msg.sender);
  _;
}

modifier onlyOwner(uint _name) {
  require(deck[0] == deck[_name]);
  _;
}

function transfer(address _to, uint _name) public reallySender(_name) {
  deck[_name] = _to;
}

function create(uint _name) public onlyOwner(_name) {
  deck[_name] = msg.sender;
}

fallback () external {
}

}

我知道我使用 uint 作为名称而不是 Bytes32 或字符串,使用 javascript 时更容易,我只想测试简单的代码。无论如何,当我运行 truffle 控制台并编写 let inst = await Balek.deployed(); 时,truffle 能够编译和部署合约。它可以工作,但我不能从合同中调用任何东西,每次我在控制台中编写以下内容时它都不起作用:

let deck = await inst.deck;
let result = await inst.create(1);

我有错误:未捕获的错误:返回的错误:处理事务时的 VM 异常:还原

事实上,我从来没有成功调用过智能合约的函数。所有这些错误对我来说似乎都是相互关联的,每当我尝试调用成功部署的合约的函数时,它都不起作用,即使我可以部署合约......

WTF:d

标签: javascriptunit-testingsoliditysmartcontractstruffle

解决方案


Truffle 不使用该.send()函数来执行合约方法。这在web3.js中使用,这是一个不同的库。

直接调用对应的JS函数即可执行合约方法:

let result = await inst.createZombie({from: accounts[0]});

Truffle 自动(基于合约 ABI)识别它是否应该发送(读写)事务或(只读)调用。

文档:https ://www.trufflesuite.com/docs/truffle/reference/contract-abstractions#making-a-transaction-via-a-contract-function


推荐阅读