El contrato no está definido en las pruebas de trufa

Estoy intentando probar uno de mis contratos, pero truffle se queja de que no está definido. Puedo ver que la prueba se compila en la carpeta de compilación y la he importado de la misma manera que otros contratos, no estoy seguro de lo que me estoy perdiendo.

El contrato:

contract OPCToken is AccessControl, StandardToken {

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

Luego tengo el script de implementación.

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

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

Entonces tengo mi prueba:

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.
    });
});
Me preguntaba si se debe a que el contrato se hereda de otros dos contratos, ¿tal vez deba esperar a que estos también se implementen? Sin embargo, he intentado importar y luego esperar tanto AccessControl como StandardToken, en varios órdenes, y ninguno de ellos parece estar definido (a pesar de que todos están definitivamente implementados). Vale la pena señalar que he intentado importar desde var OPCToken = artifacts.require("OPCToken"); y var OPCToken = artifacts.require("./OPCToken");
¿Qué error obtienes? No creo que sea causado por la herencia. Cuando un contrato A hereda de B, un A implementado ES un B. Al heredar de otro contrato, B agrega la funcionalidad de ese contrato a A.
@Henk tenías razón, no fue causado por herencia sino porque estaba sobrescribiendo la declaración de importación. He dejado una respuesta para otras personas que también pueden encontrar este problema.
Estás declarando la misma variable ( OPCToken) dos veces. ¿Cuál es el punto en eso?

Respuestas (2)

Lo tengo. Es un error de Javascript.

Es porque estoy sobrescribiendo el OPCToken que estoy importando, aquí:

const OPCToken = await OPCToken.deployed();

Funciona si hago esto en su lugar:

const opcToken = await OPCToken.deployed();

Todavía estoy un poco confundido en cuanto a por qué, sin embargo, el lado derecho no se evalúa primero (momento en el que no se ha sobrescrito) y la asignación del lado izquierdo ocurre después. ¿Es esto diferente en el entorno de prueba de trufa?

Es porque js está 'elevando' las declaraciones de variables stackoverflow.com/questions/31219420/…

La solución es simplemente cambiar el nombre, OPCTokenya que choca con el nombre del contrato.

Hay una diferencia entre el orden de evaluación del lado izquierdo/derecho y la logística de declaración variable.

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

El código anterior activará una advertencia:

myVarse usó antes de que se declarara, lo cual es ilegal para constlas variables

Compruébalo en jsfiddle .