Опубликован: 28.01.2018 | Доступ: свободный | Студентов: 924 / 142 | Длительность: 06:54:00
Лекция 5:

Использование возможностей библиотеки Web3 и среды разработки Truffle

< Лекция 4 || Лекция 5: 123456

Создание тестов для приложения

Эта лекция посвящена созданию сценариев тестирования для простого веб-кошелька. С помощью анонимной функции будет производиться начисление эфира на счет, и она будет принимать эфир только от выбранных отправителей или владельца счета. Если отправитель не находится в соответствующем списке, функция вернет ошибку. Другая функция - sendFunds. Разумеется, только авторизованные пользователи могут отправлять средства. Две другие функции наделяют (allowAddressToSend) или лишают (disallowAddressToSend) пользователей права отправлять средства, и функция killWallet позволяет уничтожить кошелек.

Еще есть два события: Deposit и Withdrawl. Стоит упомянуть, что в настоящий момент отслеживание событий - непростая задача. В скором времени выходит новая версия Ether-Pudding, облегчающая слежение за событиями в тестах. Прямо сейчас Ether-Pudding построена на основе Web3. Для отслеживания события нужно дождаться пока оно не произойдет, то есть практически следить за всеми событиями в блокчейне.

Вновь откроем два окна с командными строками Git Bash.


Если вы работаете на Mac или Linux, то уже располагаете доступом к подходящей командной строке. При работе с Windows рекомендуется использовать Git Bash, хотя можно использовать обычную командную строку Windows. Для целей тестирования будем пользоваться сетью testrpc. Откроем среду программирования, в том месте, на котором остановились в последний раз. Откроем SimpleWallet.


Необходимо отредактировать данные в каталоге migrations, т.к. потребуется разместить в блокчейне SimpleWallet.


Тесты для кошелька SimpleWallet будем размещать в каталоге test. Создадим новый файл и назовем его simplewallet.js.


После запуска теста, Ether-Padding предоставит доступ к списку счетов accounts.


Для начала проверим, имеет ли владелец счета возможность распоряжаться эфиром. Затем получим доступ к контракту с помощью вызова SimpleWallet.deployed, потом вызовем функцию, которая вернет булево значение в зависимости от прав адреса, который ей сообщим. Зададим этой функции первый счет, который по совместительству является счетом, разместившим контракт в блокчейне. С помощью ключевого слова assert функция проверит, что параметр isAllowed имеет значение "true", и если нет, то вернет соответствующее сообщение, и, наконец, возвращаем результат.


Удалим прежний вариант теста..


Перейдем в консоль. Запустим сетьtestrpc. Введем команду truffle test.


Вернемся назад и удалим ссылку на ConvertLib.


Запустим команду truffle test еще раз. Теперь все работает.


Проверим, что другая учетная запись не имеет прав на отправку средств. В контракт внесены два изменения. Первое изменение: в код теста включена проверка на равенство параметров - assert.equal. Вы можете задать функцию проверки и самостоятельно. Необходимо убедиться, что вы будете проверять существующие функции, иначе тест предсказуемо не сработает.

С помощью второго теста проверим, что некоторая учетная запись, не авторизованная на отправку средств, действительно не сможет это сделать, и функция isAllowedToSend вернет значение "false".


Попробуем запустить этот тест. Он не сработал. Значение isAllowed - "правда", даже несмотря на то, что счет не должен иметь прав на распоряжение средствами.


Вернемся в код кошелька и разберемся, в чем дело. Переключимся на метод isAllowedToSend. Он получает адрес, затем проверяет, что в соответствующей ассоциации для isAllowedToSend стоит значение "true", или отправитель сообщения является владельцем счета. В нашем случае msg.sender действительно является владельцем счета, поскольку тест был запущен в блокчейне от лица первой учетной записи - собственно владельца. Поэтому значения msg.sender и owner совпадают. Необходимо подправить код теста для отражения этого факта.


Проведем тест заново. Теперь все проходит успешно.


Продолжим тестирование. Проверим, можно ли добавлять учетные записи к списку тех, которые имеют право распоряжаться эфиром.


Для начала проведем проверку, что счет accounts[1] может распоряжаться эфиром. Ожидаем, что это не удастся. Затем позволим этому адресу, accounts[1] , отправлять эфир. После этого проверяем, что отправка действительно разрешена, и ожидаем возврата значения "true". Теперь убираем права этого адреса на распоряжение эфиром. Проверяем способность к отправке и ожидаем, что вернется значение "false". Теперь запустим тест.


При запуске теста Truffle всегда размещает в блокчейне новый контракт и проводит весь набор тестов с самого начала.


Запустим тест для проверки функции пополнения счета. Для начала отправим эфир контракту с первого счета. Выбираем адрес контракта и отправляем одну единицу эфира.


Если переключимся на контракт, то увидим, что было создано событие пополнения счета.


В текущем тесте встроим функцию проверки, что имя события - Deposit, пополнение произошло на величину в одну единицу эфира, и было произведено со счета accounts[0] .


Затем нужно остановить тест; это важный момент. В предыдущих тестах мы возвращали некоторое сообщение. В текущем случае возвращать сообщение не получится. Поэтому воспользуемся функцией done. Если добавить функцию done к числу параметров при создании теста, то сможем вызвать ее без дополнительных параметров и сообщить машине для тестирования, что тест завершен. Если вызовем done с какими-либо параметрами, тест будет считаться проваленным. Таким образом, при наступлении ожидаемого события прекращаем наблюдение за событиями и вызываем функцию done без параметров.

Проверим, работает ли этот тест. Да, все сработало.


Добавим еще один тест: безымянная функция, ответственная за получение эфира, выдает ошибку, если отправка средств осуществляется счетом, не внесенным в число авторизованных на отправку эфира.


Необходимо отправить эфир со счета accounts[1]. Отправляем эту транзакцию в контракт SimpleWallet. Счет accounts[1] не наделен полномочиями отправлять средства со счета. В контракте SimpleWallet есть безымянная функция, проверяющая, что отправитель сообщения msg.sender является владельцем (owner), или что он наделен правами на распоряжение средствами - в этих случаях функция допустит перечисление эфира и создаст соответствующее событие; в противном случае она выдаст сообщение об исключении.


Давайте используем функцию callback из sendTransaction, и проверим, что переменная error имеет значение "true", в этом случае можно вызвать функцию done без дополнительных параметров. Если переменная error не имеет значения "true", вызовем done с параметром в виде переменной result. А, как мы помним, если done вызывается с параметром, это означает, что тест провален. Поэтому ожидаем увидеть сообщение об ошибке. Выполняем тест.


В данной лекции подробно разобрали, как создавать простые тесты и более сложные тесты, как наблюдать за событиями и проверять ошибки. Этим знания помогут самостоятельно протестировать остальные аспекты работы контракта.

< Лекция 4 || Лекция 5: 123456
Алексей Миронов
Алексей Миронов

Здравствуйте, сколько стоит курс Работа с Ethereum?