Тест трюфеля JS не работает - PullRequest
0 голосов
/ 31 мая 2018

У меня есть контракт солидности в среде 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)

1 Ответ

0 голосов
/ 31 мая 2018

В контракте нет метода setPlayers, как вы упомянули в тесте.


Вы не можете напрямую получить доступ к массиву контракта в вашем javascript.Сначала вам нужно вызвать players как метод.

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");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...