【问题标题】:Truffle JS test not working松露 JS 测试不起作用
【发布时间】:2018-05-31 18:46:14
【问题描述】:

我在 Truffle 框架中有一个可靠的合约,但我无法弄清楚为什么我的 JS 测试不起作用。

我正在尝试测试“setPlayers”函数,合约有效并且测试正在运行,但我不明白如何在测试中调用该函数:

pragma solidity ^0.4.23;

contract Swindle {
    string  public eventName;
    uint public entryFee;
    string[] public players;
    string public winner;
    uint public winnings;

    function comp(string _eventName, uint _entryFee) public {
        eventName = _eventName;
        entryFee = _entryFee;
    }

    function addPlayers(string _player) public {
        players.push(_player);
    }

    function winner(string _player) public returns (string, uint) {
        winner = _player;
        winnings = (players.length * entryFee);
        return (winner, winnings);
    } 
}

测试文件:

var Swindle = artifacts.require("Swindle");

contract('Swindle', function(accounts) {

    it('sets player to stuart', function(){
        return Swindle.deployed().then(function(instance) {
            swindle = instance;
            return swindle.addPlayers.call("stuart");
        }).then(function(swindle) {
            assert.equal(swindle.players[0], "stuart", "sets the total supply");
        })
    })
})

错误:

0 passing (302ms)
  1 failing

  1) Contract: Swindle
       sets player to stuart:
     TypeError: Cannot read property '0' of undefined
      at test/test-swindle.js:10:32
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:118:7)

【问题讨论】:

    标签: javascript ethereum solidity truffle


    【解决方案1】:

    正如您在测试中提到的那样,合同中没有setPlayers 方法。


    您不能在您的 javascript 中直接访问合约数组。首先你需要调用players as 方法。

    it('sets player to stuart', function(){
            return Swindle.deployed().then(function(instance) {
                swindle = instance;
                return swindle.addPlayers.call("stuart");
            }).then(function(swindle) {
                return swindle.players();
            }).then(function(players) {
                assert.equal(players[0], "stuart", "sets the total supply");
            })
        })
    

    您可以async/await 以获得更好的测试可读性。

    it('sets player to stuart', async () => {
        let swindle = await Swindle.deployed();
        await swindle.addPlayers.call("stuart");
        let players = await swindle.players.call();
        assert.equal(players[0], "stuart", "sets the total supply");
    });
    

    【讨论】:

    • 谢谢我用新的错误和函数名称更新了我的问题
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2017-11-03
    • 2021-09-22
    • 2023-04-10
    相关资源
    最近更新 更多