Контракт не определен в трюфельных тестах

Я пытаюсь протестировать один из своих контрактов, но трюфель жалуется, что он не определен. Я вижу, что тест компилируется в папку сборки, и я импортировал его так же, как и другие контракты, я не уверен, что мне не хватает.

Контракт:

contract OPCToken is AccessControl, StandardToken {

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

Затем у меня есть сценарий развертывания

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

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

Тогда у меня есть тест:

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.
    });
});
Мне интересно, потому что контракт наследуется от двух других контрактов, возможно, мне нужно дождаться их развертывания? Однако я пытался импортировать, а затем ожидать как AccessControl, так и StandardToken в разном порядке, и ни один из них, похоже, не определен (несмотря на то, что все они определенно развернуты). Стоит отметить, что я пытался импортировать из var OPCToken = artifacts.require("OPCToken"); и var OPCToken = artifacts.require("./OPCToken");
Какая у вас ошибка? Я не думаю, что это связано с наследственностью. Когда контракт A наследуется от B, развернутый A ЯВЛЯЕТСЯ B. Наследование от другого контракта — это B, добавляющий функциональность этого контракта к A.
@ Хенк, ты был прав, это было не по наследству, а потому, что я перезаписывал оператор импорта! Я оставил ответ для других людей, которые также могут столкнуться с этой проблемой.
Вы дважды объявляете одну и ту же переменную ( OPCToken). Какой в ​​этом смысл?

Ответы (2)

А, понял. Это ошибка Javascript.

Это потому, что я перезаписываю OPCToken, который я импортирую, здесь:

const OPCToken = await OPCToken.deployed();

Это работает, если я сделаю это вместо этого:

const opcToken = await OPCToken.deployed();

Я все еще немного смущен тем, почему - разве правая сторона не оценивает сначала (в этот момент она не была перезаписана) - а левое присваивание происходит после. Отличается ли это в тестовой среде с трюфелями?

Это потому, что js «поднимает» объявления переменных stackoverflow.com/questions/31219420/…

Решение состоит в том, чтобы просто переименовать, OPCTokenпоскольку оно конфликтует с именем контракта.

Существует разница между левым/правым порядком оценки и логистикой объявления переменных.

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

Приведенный выше код вызовет предупреждение:

myVarиспользовался до того, как был объявлен, что недопустимо для constпеременных

Проверьте это на jsfiddle .