У меня есть концентрационный контракт (1), который использует фабрику контрактов (2) для создания контракта (3). Я пишу несколько тестов на JavaScript, чтобы убедиться, что контракт 3 создан правильно. Я могу сказать, что события генерируются правильно, но когда я хочу проверить функции контракта 3 (#tryingtobethorough), похоже, что Truffle не распознает созданный адрес контракта 3 как контракт (т.е.) TypeError: contract3Address.functionName is not a function
. Распознает ли тестирование Truffle Javascript адреса как контракты только в том случае, если они развернуты с помощью миграции Truffle? Есть ли обходной путь для этого в Javascript? Возможно, это лучший тестовый пример для тестирования Solidity?
Ниже приведены некоторые упрощенные версии того, с чем я работаю:
Контракт 1: Хаб
import "./Contract2Interface.sol";
contract Contract1 {
Contract2Interface I;
function Contract1(address Contract2Address){
I = Contract2Interface(Contract2Address);
}
function creation() returns (address newcontract3) {
address theCreatedContract3 = I.createNewContract3();
return newcontract3;
}
}
Контракт 2: Контрактная фабрика
import "./Contract3.sol";
import "./Contract2Interface.sol";
contract Contract2 is Contract2Interface {
event ContractCreation(address _newContract);
function createNewContract3() public returns(address) {
Contract3 createdContract3 = new Contract3();
ContractCreation(createdContract3);
return createdContract3;
}
}
Контракт 3: Контракт должен быть создан
contract Contract3{
uint256 public num;
function storeNum(uint256 newNum) public returns(bool) {
num = newNum;
}
}
JavaScript Test Это упрощенно, но я думаю, что дает достаточно идеи.
beforeEach(async function(){
contractFactory = await Contract2.new();
contractHub = await Contract1.new(contractFactory.address);
});
describe("Creating contract 3", async function(){
it("Should allow us to create contract 3", async function(){
let result = await contract1.createNewContract3({from: owner});
//Event data
let log = resultTwo.logs[0];
let contract3Address = log.args._newContract;
console.log(contract3Address) //I can see this is a valid contract address & event has been emitted properly.
let newnum = await contract3Address.storeNum(7);
// At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
})
})
Пара вопросов
В функции creation
Contract1 вы возвращаетесь newcontract3
без присвоения значения, поскольку это адрес, возвращаемое значение будет по умолчанию address(0x0)
. Вероятно, вы хотите присвоить результат createNewContract3()
.
function creation() returns (address newcontract3) {
newcontract3 = I.createNewContract3();
return newcontract3;
}
В вашем тесте вы присваиваете contract3Address
параметру события тип string
. В трюфеле, когда вы хотите взаимодействовать с контрактом по заданному адресу, вам нужно получить экземпляр, указывающий на этот адрес, const myContract = await MyContract.at("address");
т.е.
describe("Creating contract 3", async function(){
it("Should allow us to create contract 3", async function(){
let result = await contract1.createNewContract3({from: owner});
//Event data
let log = resultTwo.logs[0];
let contract3Address = log.args._newContract;
// Get instance pointing to address obtained from event
const contract3 = await Contract3.at(contract3Address);
let newnum = await contract3.storeNum(7);
// At this point I get an error that "storeNum" is not a function of contract3Address from Truffle testing
})
})
Карен С