Невозможно прочитать переменную экземпляра контракта из развернутого контракта с помощью трюфельного теста

Я пытаюсь написать несколько модульных тестов, поскольку работаю над разработкой некоторых смарт-контрактов, но столкнулся с проблемой, которая мешает мне продолжить. Я пытаюсь проверить адрес экземпляра контракта, который был импортирован в мой смарт-контракт, развернутый в моей локальной сети.

Например:

import "./ContractB.sol";

contract ContractA {
    ContractB public _cB;

    constructor(address _addr) public {
        _cB = ContractB(_addr);
    }

}

Я хотел бы получить адрес _cB после того, как ContractA был развернут в сети, но мои попытки пока безуспешны. Вот методы, которые я пытался извлечь адрес, но пока ни один из них не оказался успешным:

Первый метод:

contract('ContractA', (accounts) => {
    it("should return the address of the ContractB contract", () => {
        return ContractA.deployed().then((instance) => {
            return instance._cB;
        }).then((address) => {
            assert.equal(address, accounts[0], "The addresses don't match");
        });
    });
});

Второй метод:

contract('ContractA', (accounts) => {
    it("should return the address of the ContractB contract", () => {
        return ContractA.deployed().then((instance) => {
            return instance._cB.address;
        }).then((address) => {
            assert.equal(address, accounts[0], "The addresses don't match");
        });
    });
});

Третий метод:

contract('ContractA', (accounts) => {
    it("should return the address of the ContractB contract", () => {
        return ContractA.deployed().then((instance) => {
            return instance._cB.call();
        }).then((address) => {
            assert.equal(address, accounts[0], "The addresses don't match");
        });
    });
});

Четвертая попытка

var contractA = null;
beforeEach(() => {
    return ContractA.new(accounts[0]).then((instance) => {
        contractA = instance;
    })
});

it("should return the address of the ContractB contract", () => {
    assert.equal(contractA._cB.address, accounts[0], "The addresses don't match");
});

Если у кого-то есть идеи или есть опыт в этом, буду признателен за помощь. Заранее спасибо.

PS Я знаю, что тест-кейс, который я написал, всегда будет возвращать false, но я просто хотел бы увидеть результат. На данный момент я всегда получаю «неопределенное».

Ответы (1)

Извиняюсь, если ошибаюсь в синтаксисе.

Попробуйте beforeEach()работать со свежим экземпляром контракта для каждого теста.

require Contract = artifacts ...

var contract;
var sender = accounts[0];
var sendee = accounts[1];

beforeEach(function() {
  return Contract.new(sendee) // will default to accounts[0]
  .then(function(instance) {
     contract = instance;
  }
}

...
it("should ... match sendee" ...

Если я не ошибаюсь, truffle testон изо всех сил старается не действовать в .deployed()качестве защиты, чтобы модульные тесты не топтали контракты, которые находятся в производстве.

Надеюсь, поможет.

Привет, Роб, спасибо за твой ответ. К сожалению, я все еще получаю «неопределенный» вывод. Я вставил код, который использовал в блоке кода «Четвертая попытка» в своем ОП.
В четвертой попытке вы пытаетесь синхронно прочитать значение и используете странный синтаксис. Вам нужноcontractA._cb().then(function(response) { // now eval response ...
К сожалению, если я попытаюсь использовать _cb(), я получу сообщение об ошибке contractA._cB() is not a function, а выполнение без круглых скобок приведет к сообщениюCannot read property 'then' of undefined