Я пытаюсь написать несколько модульных тестов, поскольку работаю над разработкой некоторых смарт-контрактов, но столкнулся с проблемой, которая мешает мне продолжить. Я пытаюсь проверить адрес экземпляра контракта, который был импортирован в мой смарт-контракт, развернутый в моей локальной сети.
Например:
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, но я просто хотел бы увидеть результат. На данный момент я всегда получаю «неопределенное».
Извиняюсь, если ошибаюсь в синтаксисе.
Попробуйте 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 ...
мсафи
contractA._cB() is not a function
, а выполнение без круглых скобок приведет к сообщениюCannot read property 'then' of undefined