Здравствуйте, сколько стоит курс Работа с Ethereum? |
Использование возможностей библиотеки Web3 и среды разработки Truffle
Создание тестов для приложения
Эта лекция посвящена созданию сценариев тестирования для простого веб-кошелька. С помощью анонимной функции будет производиться начисление эфира на счет, и она будет принимать эфир только от выбранных отправителей или владельца счета. Если отправитель не находится в соответствующем списке, функция вернет ошибку. Другая функция - 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 вызывается с параметром, это означает, что тест провален. Поэтому ожидаем увидеть сообщение об ошибке. Выполняем тест.
В данной лекции подробно разобрали, как создавать простые тесты и более сложные тесты, как наблюдать за событиями и проверять ошибки. Этим знания помогут самостоятельно протестировать остальные аспекты работы контракта.