Тесты Truffle Javascript не изменят состояние контракта (состояние контракта не изменится)

Я просмотрел аналогичный ответ, но он не сработал. Прямо сейчас я начинаю с примера, пробуя трюфель, я сделал небольшой проект Echo, основанный на ящике для зоомагазина от Truffle. И у меня есть некоторые проблемы:

Мой договор такой:

pragma solidity ^0.4.24;

import "./strings.sol";

contract Echo{
    address public owner;
    string[] private history;
    using strings for *;
    string public s;
    string public lastMessage;
    uint public messageCount;

modifier onlyOwner() {
    if (msg.sender == owner) _;
}

constructor() public {
    owner = msg.sender;
    lastMessage = "None yet";
}

function echo(string text) public returns (string) {
    history.push(text);
    lastMessage = text;
    messageCount++;
    return text;
}

function fullHistory() public view returns (string){
    string memory _history = "";
    for (uint i = 0; i < history.length; i++){
        _history = _history.toSlice().concat("||".toSlice()).toSlice().concat(history[i].toSlice());
    }
    return _history;
}

}

Так что мои тесты на солидность работают отлично, я получил новые значения при проверке истории команд:

contract TestEcho {
    Echo echo = Echo(DeployedAddresses.Echo());

    function testWeReceiveWhatWeSend() public {
        string memory testText = "HELLO";
        string memory returnedText = echo.echo(testText);
        Assert.equal(returnedText, testText, "Should receive the same");
//        Assert.notEqual(word_count, 0, "Should have receive more than one");
    }

    function testWeReceiveTheHistory() public {
        string memory testText = "HELLO";
        echo.echo(testText);
        string memory fullHistory = echo.fullHistory();
        Assert.equal(fullHistory, "||HELLO||HELLO", "Should receive something");
    }

    function testWeReceiveTheLastMessage() public {
        string memory testText = "THE SECOND";
        echo.echo(testText);
        string memory message = echo.lastMessage();
        Assert.equal(message, testText, "Should receive the last message");
    }

    function testWeReceiveTheMessageCount() public {
        uint msgCount = echo.messageCount();
        Assert.notEqual(msgCount, 0, "Should be more than 0");
    }
}

Но в javascript им не удается изменить состояние контракта, historyмассив никогда не изменится. То же самое происходит со мной в сети. Может быть, я точно упускаю что-то очевидное, но я с этим несколько дней не нашел решения:

contract('Echo', async (accounts) => {
const from = accounts[0];

it("should return the same that i sent", async () => {
    const instance = await Echo.deployed();
    const textMessage = "TEST";
    const text = await instance.echo.call(textMessage, {from});
    assert.equal(text, textMessage, "echoes");
});

it("should return full history", async () => {
    const instance = await Echo.deployed();
    await instance.echo.call(web3.fromAscii("TEST"), {from});
    await instance.echo.call("TEST", {from});
    await instance.echo.call("TEST", {from});
    const history = await instance.fullHistory.call();
    console.log("FULL_HISTORY", history);
});
}

И по какой-то причине, которую я не знаю, Metamask перестал спрашивать меня о расходе газа, когда я использую функцию эха в браузере, я уже проверяю порт, и сеть правильная, на счету есть средства, единственное, что изменилось было то, что я случайно удалил METAMASK и установил новую версию. Тем не менее это не объясняет, почему тесты не работают.

буду признателен за возможную помощь

Изменить await Echo.deployed()на await artifacts.require("Echo.sol").new(). Кроме того, это не обязательно, но вы можете поместить его внутри beforeпредложения, а не внутри каждого из itпредложений (в зависимости от того, как вы хотите, чтобы ваш тест вел себя).
@goodvibration тот же результат

Ответы (1)

Решено!!!, извините за все проблемы...

ОБЪЯСНЕНИЕ:

Когда вы используете web3.js, форма:

ContractInstance.method.call()

Это просто для методов, которые аннотированы как представление или доступны только для чтения, вы все равно можете использовать что-то еще, но это не изменит состояние контракта. Вместо этого вы хотите использовать:

ContractInstance.method()

Просто маленькая деталь. РЖУ НЕ МОГУ