Vertrag ist in Trüffeltests nicht definiert

Ich versuche, einen meiner Verträge zu testen, aber Truffle beschwert sich, dass er nicht definiert ist. Ich kann sehen, dass der Test in den Build-Ordner kompiliert wird, und ich habe ihn genauso importiert wie andere Verträge, ich bin mir nicht sicher, was mir fehlt.

Der Vertrag:

contract OPCToken is AccessControl, StandardToken {

    constructor() {
        owner = msg.sender;
     }
}

Dann habe ich das Bereitstellungsskript

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

module.exports = function(deployer) {
    deployer.deploy(OPCToken);
}

Dann habe ich meinen Test:

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

contract('OPCToken', function(accounts) {

    it("any C level address can open the contract for applications", async () => {
        const OPCToken = await OPCToken.deployed(); // it throws here that OPCToken is not defined.
    });
});
Ich habe mich gefragt, ob es daran liegt, dass der Vertrag von zwei anderen Verträgen erbt. Vielleicht muss ich warten, bis diese ebenfalls bereitgestellt werden? Ich habe jedoch versucht, sowohl AccessControl als auch StandardToken in verschiedenen Reihenfolgen zu importieren und dann abzuwarten, und keiner von ihnen scheint definiert zu sein (obwohl alle definitiv bereitgestellt werden). Erwähnenswert ist, dass ich versucht habe, aus var OPCToken = artifacts.require("OPCToken"); und zu importieren var OPCToken = artifacts.require("./OPCToken");
Welchen Fehler erhalten Sie? Ich glaube nicht, dass es durch Vererbung verursacht wird. Wenn ein Vertrag A von B erbt, ist ein bereitgestelltes A ein B. Das Erben von einem anderen Vertrag bedeutet, dass B die Funktionalität dieses Vertrags zu A hinzufügt.
@Henk du hattest Recht, es wurde nicht durch Vererbung verursacht, sondern weil ich die Importanweisung überschrieben habe! Ich habe eine Antwort für andere Personen hinterlassen, die möglicherweise auch auf dieses Problem stoßen.
Sie deklarieren dieselbe Variable ( OPCToken) zweimal. Was ist der Sinn daran?

Antworten (2)

Ah, ich habe es. Es ist ein Javascript-Fehler.

Das liegt daran, dass ich das OPCToken überschreibe, das ich hier importiere:

const OPCToken = await OPCToken.deployed();

Es funktioniert, wenn ich stattdessen Folgendes mache:

const opcToken = await OPCToken.deployed();

Ich bin immer noch ein wenig verwirrt darüber, warum - wird die rechte Seite nicht zuerst ausgewertet (an diesem Punkt wurde sie nicht überschrieben) - und die Zuweisung auf der linken Seite erfolgt danach. Ist das beim Trüffeltest anders?

Es liegt daran, dass js Variablendeklarationen „hochzieht“ stackoverflow.com/questions/31219420/…

Die Lösung besteht darin, einfach umzubenennen, OPCTokenda es mit dem Vertragsnamen kollidiert.

Es gibt einen Unterschied zwischen der linken/rechten Auswertungsreihenfolge und der Variablendeklarationslogistik.

const myVar = 3;
const myVar = myVar * 14;

Der obige Code löst eine Warnung aus:

myVarverwendet wurde, bevor es deklariert wurde, was für constVariablen unzulässig ist

Überprüfen Sie es auf jsfiddle .