Как инициализируется контракт в трюфельных тестах на прочность?

pragma solidity ^0.4.17;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Adoption.sol";
contract TestAdoption {

    **Adoption adoption = Adoption(DeployedAddresses.Adoption());**

    function testGetAdoptorAddressByPetId() public{
        address expected = this;
        address[16] memory adoptors = adoption.getAdoptors();
        Assert.equal(adoptors[8], expected, "Owner of pet Id 8 should be recorded");
    }

}

Может ли кто-нибудь объяснить, как экземпляр контракта создается из адреса в трюфельной структуре? Принятие = Принятие (DeployedAddresses.Adoption());

Ответы (1)

Тестовый контракт TestAdoptionразвертывается автоматически тестовой средой Truffle, ваш контракт Adoptionразвертывается в сценариях миграции.

Эта линия

Adoption adoption = Adoption(DeployedAddresses.Adoption());

не создает новый контракт, а вместо этого присваивает adoptionпеременной адрес, развернутый скриптами миграции (развернутые адреса хранятся внутри контракта DeployedAddresses)

Для получения дополнительной информации о Truffle Solidity Test обратитесь к их документации .

Спасибо за объяснение. Я понимаю ту часть, где развернутые адреса хранятся в DepoyledAddresses.sol и извлекаются с помощью DepoyledAddresses.<имя контракта>(). Почему адрес развернутого контракта заключен в имя контракта «Принятие (адрес)». Какова внутренняя работа этого утверждения. Это то, что мне трудно понять.
Функция DeployedAddresses.Adoption()возвращает значение типа address, в Solidity вы не можете напрямую присвоить его переменной типа Adoption, которую вы должны явно преобразовать. Это обязательно во избежание ошибок, таких как компиляция, делающая ошибочное преобразование.