Einfaches Debuggen während der Tests

Ich bin neu in Solidity und hätte gerne ein bisschen Debugging.

Dies ist mein einfaches Beispiel (ich verwende web3 1.0)

Ich habe eine einfache Funktion in meinem Vertrag

function bar(address _address_usr) public  {
        uint res = 5;
        emit foo('test',res);       
    }

Und ich habe einen Test darüber

.....
it("...", async () => {

        let livello = await instance.methods.bar(accounts[0]).call();


        instance.events.foo(function (error, event) {
            console.log(event);
        })
            .on('data', function (event) {
                console.log("OK");
                console.log(event); 
            })
            .on('changed', function (event) {
                console.log("OK");
            })
            .on('error', console.error);    

    });
....

Ich würde gerne das Ergebnis von res wissen. Ich habe es mit event versucht, aber ich habe diesen Fehler

err Error: The current provider doesn't support subscriptions: HttpProvider

Kann ich ein Ergebnis/eine Var in meiner Konsole wie console.log oder so etwas drucken?

Danke

AKTUALISIEREN

Meine web3-Instanz

Helfer.js

const Web3 = require("web3") // import web3 v1.0 constructor

// use globally injected web3 to find the currentProvider and wrap with web3 v1.0
const getWeb3 = () => {
    const myWeb3 = new Web3(web3.currentProvider)
    return myWeb3
}

// assumes passed-in web3 is v1.0 and creates a function to receive contract name
const getContractInstance = (web3) => (contractName) => {
    const artifact = artifacts.require(contractName) // globally injected artifacts helper
    const deployedAddress = artifact.networks[artifact.network_id].address
    const instance = new web3.eth.Contract(artifact.abi, deployedAddress)
    return instance
}

module.exports = { getWeb3, getContractInstance }

meine test.js

const {getWeb3, getContractInstance} = require("./helpers")
const web3 = getWeb3()
const getInstance = getContractInstance(web3)
Ich empfehle, sich anzusehen, wie Open Zeppelin Tests implementiert, sie haben Hilfsfunktionen zum Analysieren von Ereignissen, github.com/OpenZeppelin/openzeppelin-solidity/blob/master/test/… , aber ehrlich gesagt vermisse ich die alte Art und Weise, wie sie Dinge taten: P.
Versuchen Sie, den Code zu teilen, in dem Sie die web3-Instanz erstellen, ich denke, Sie verwenden möglicherweise die Websocket-Funktionalität und das ist, wo es fehlschlägt, um den Fehler abzufangen, versuchen Sie es beim Generieren der Instanz, um das Problem zu beheben, verwenden Sie nicht ws, oder verwenden Sie einen Web-Socket-kompatiblen Knoten
@EnriqueAlcazar Ich habe meine Frage aktualisiert. Die einzige Möglichkeit, Variablen in meinem Code zu lesen, sind Ereignisse?
Wenn Sie debuggen möchten, können Sie Remix verwenden, sie haben einen ziemlich guten Debugger, denken Sie auch daran, dass Sie Zeichenfolgen als zweiten Parameter für Ihre Reverts verwenden können, und Sie können konstante Funktionen (Ansichten) erstellen, um jeden Parameter in Ihrer Blockchain zu lesen
Überprüfen Sie, ob web3, das Sie verwenden, korrekt ist, IE: console.log es und prüfen Sie, ob die Parameter korrekt sind

Antworten (1)

Ihr Fehler besagt, dass Sie HttpProviderfür web3 verwenden, und gemäß der web3-Dokumentation hier heißt es:

Objekt – HttpProvider: Der HTTP-Anbieter ist veraltet, da er für Abonnements nicht funktioniert.

und dieser Fehler wird von diesem Code angezeigt :

// throw error, if provider doesnt support subscriptions
    if(!this.options.requestManager.provider.on) {
        var err2 = new Error('The current provider doesn\'t support subscriptions: '+ this.options.requestManager.provider.constructor.name);
        this.callback(err2, null, this);
        this.emit('error', err2);
        return this;
    }

Ich denke, für das Abonnement von Veranstaltungen sollten Sie versuchen, andere Anbieteralternativen zu verwenden.

UPDATE: Um den Wert von Ereignisparametern zu erhalten, können Sie den Code wie folgt ändern:

   it("...", async () => {

            let livello = await instance.methods.bar(accounts[0]).send();
            console.log(livello.events.foo.returnValues);
}

Dadurch werden die Ereignisparameterwerte gedruckt. Weitere Informationen finden Sie unter: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send

Wenn Sie außerdem nur den Variablenwert drucken möchten, sollten Sie lieber die Funktion view/pure ohne Ereignisse verwenden. Weitere Informationen finden Sie unter: https://solidity.readthedocs.io/en/v0.5.0/contracts.html#functions

Ich habe meine Frage aktualisiert
Suchen Sie nach den Werten von Ereignisvariablen aus der Transaktion?
Ich hätte gerne eine Methode, um meinen Vertrag zu debuggen. Ich möchte den Widerstandswert für die Instanz abrufen. Event ist ein guter Ansatz?
entfernen .call()Sie es aus Ihrem Funktionsaufruf und Sie erhalten es in den Ereignisparametern.
Ich habe den gleichen FehlerThe current provider doesn't support subscriptions: HttpProvider
Entfernen Sie diesen Ereigniscode und fügen Sie ihn hinzuconsole.log(livello.logs.foo.args)
danke für die Antwort, wenn ich console.log (livello.logs.foo.args) mache; es ist leer