Мощный франтовский контракт для модульного тестирования

Я новичок в Ethereum и солидности, я разрабатываю простое децентрализованное приложение с использованием Truffle, где у меня есть абстрактный контракт Storage и другой контракт Reader, который использует хранилище.

contract Storage {
    function getWeight() public view returns(uint8);
    function setWeight(uint8 weight) public view returns(bool); 
}

contract Reader {
    Storage private storage;
    constructor(address storageAddress) {
        storage = Storage(storageAddress);
    }
}

Я пытаюсь написать единичный тест для контракта Reader, так или иначе, чтобы высмеять поведение абстрактного контракта? Если нет, то какова наилучшая практика для этой ситуации?

3 голоса | спросил user3299116 24 J0000006Europe/Moscow 2018, 23:19:36

1 ответ


2

Я создал небольшую реализацию контракта Хранения. Обратите внимание, что я переименовал вашу абстракцию в StorageInterface.

Я также добавил некоторые функции для Reader, так как нечего тестировать, если он что-то не делает. Итак, теперь у вас есть сеттер /получатель в Reader, который пересылает контракт на хранение, который является реализацией интерфейса.

Посмотрев на это, я решил, что мне неудобно использовать «Хранение», потому что это зарезервированное слово в нижнем регистре. Я также отказался от uint8, который выглядит как преждевременная оптимизация.

Еще одна мелочь. Интерфейс объявил установщик как view, но это не может быть, поскольку он записывает состояние контракта.

pragma solidity 0.4.24;

contract StoreInterface {
    function getWeight() public view returns(uint);
    function setWeight(uint weight) public returns(bool); 
}

/**
 * Just a very simple set of stubs ...
 * Deploy a "Store" and then pass its address into Reader's constructor.
 */

contract Store is StoreInterface {

    uint weight;

    event LogSetWeight(address sender, uint weight);

    function getWeight() public view returns(uint) {
        return weight;
    }

    function setWeight(uint _weight) public returns(bool) {
        weight = _weight;
        emit LogSetWeight(msg.sender, _weight);
        return true;
    } 
}

contract Reader {

    StoreInterface store;

    constructor(address storeAddress) public {
        store = StoreInterface(storeAddress);
    }

    function getWeight() public view returns(uint) {
        return store.getWeight();
    }

    function setWeight(uint weight) public returns(bool) {
        return store.setWeight(weight);
    }
}

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

ответил Rob Hitchens B9lab 25 J0000006Europe/Moscow 2018, 00:22:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132