Truffle Javascript-Tests ändern den Vertragsstatus nicht (Vertragsstatus ändert sich nicht)

Ich habe eine ähnliche Antwort überprüft, aber es hat nicht funktioniert. Im Moment beginne ich mit einem Beispiel, bei dem ich Trüffel probiere, ich habe ein kleines Echo-Projekt gemacht, das auf der Pet Store Box von Truffle basiert. Und ich habe ein paar Probleme:

Mein Vertrag sieht so aus:

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;
}

}

Meine Solidity-Tests funktionieren also perfekt, ich habe die neuen Werte erhalten, als ich die Befehlshistorie überprüft habe:

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");
    }
}

Aber in Javascript können sie den Vertragsstatus historynicht ändern, das Array wird sich nie ändern. Dasselbe passiert mir im Netz. Vielleicht vermisse ich mit Sicherheit etwas Offensichtliches, aber ich bin seit Tagen ohne Lösung dabei:

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);
});
}

Und aus irgendeinem Grund, den ich nicht kenne, fragt mich Metamask nicht mehr, ob ich etwas Gas ausgeben soll, wenn ich die Echo-Funktion im Browser verwende, ich überprüfe bereits den Port, und das Netzwerk ist korrekt, das Konto hat Geld, das einzige, was sich geändert hat war, dass ich versehentlich METAMASK deinstalliert und eine neue Version installiert habe. Das erklärt aber noch nicht, warum die Tests nicht funktionieren

Ich werde die mögliche Hilfe schätzen

Wechseln Sie await Echo.deployed()zu await artifacts.require("Echo.sol").new(). Auch kein Muss, aber Sie möchten es vielleicht in eine beforeKlausel anstatt in jede der itKlauseln einfügen (je nachdem, wie sich Ihr Test verhalten soll).
@goodvibration gleiches Ergebnis

Antworten (1)

Gelöst!!!, Entschuldigung für die ganzen Probleme...

ERLÄUTERUNG:

Wenn Sie web3.js verwenden, das Formular:

ContractInstance.method.call()

Es ist nur für Methoden, die als Ansicht kommentiert oder schreibgeschützt sind, Sie können immer noch etwas anderes verwenden, aber es ändert nicht den Vertragsstatus. Stattdessen möchten Sie Folgendes verwenden:

ContractInstance.method()

Nur ein kleines Detail. LOL