Что ж, это не пост о кофе мокко, как показано на изображении выше. На этот раз мы расскажем немного больше о MochaJS, пакете NPM в NodeJS, используемом для выполнения тестирования. MochaJS - это полнофункциональная среда тестирования, созданная специально для JavaScript, и когда мы пишем наш смарт-контракт с использованием TruffeJS, это означает, что мы можем использовать эту структуру для выполнения тестирования всех функций, содержащихся в смарт-контракте.

Хотя этот пост не предназначен специально для Mocha (более подробно вы можете прочитать об этом на www.mochajs.org), мы просто создадим небольшой пост об использовании Mocha для тестирования. В предыдущем посте мы провели множество тестов наших функций смарт-контрактов (https://daneswa.medium.com/solidity-smart-contract-interaction-and-testing-with-web3-js-and-mocha-3a0467a01805? source = user_profile --------- 0 ----------------------------) , поэтому, пожалуйста, проверьте это сообщение на наличие более полное прохождение игры. Мы постараемся объяснить использование Mocha для целей тестирования настолько просто, насколько это возможно, поскольку тестирование очень важно при написании смарт-контрактов, поскольку оно потребует реальных денег при развертывании смарт-контрактов, даже при отправке функции / транзакции в MainNet будет стоить реальных денег.

Прежде всего нам нужно установить модуль Mocha для тестирования.

npm install mocha --save

Затем импортируйте все необходимые модули и передайте их переменным;

const asset require ('assert');

Мы будем использовать очень простой класс JavaScript под названием Car.

class Car {
     
     start() {
     return 'Car is started';
     stop() {
     return 'Car is stopped';
}

У класса Car будет 2 функции; park () и stop (). Теперь мы протестируем функцию с помощью методов assert () в Mocha, поэтому при вызове функций класса они будут генерировать те же значения, что и значения, определенные в критериях тестирования.

MochaJS имеет 3 компонента каждый раз, когда он выполняет тестирование;

  • beforeEach () - будет указываться перед всеми методами тестирования, обычно содержит все повторяющиеся аргументы / методы, так что команды будут выполняться только один раз перед выполнением других команд.
  • describe () - в основном группа функций тестирования
  • it () - каждый критерий тестирования, который содержит все функции для выполнения тестирования.

Мы создадим еще один экземпляр из класса Car

car = new Car();

А поскольку для каждой функции тестирования нам нужно объявить этот экземпляр, мы создаем глобальную функцию для car и передаем объявление экземпляра в оператор beforeEach ().

let car;
beforeEach( () => {
     car = new Car;
});

Теперь мы хотим создать функции тестирования для каждой функции класса, передав их в методы assert.

describe('Car', () => {
     it('can start', () => {
     assert.equal(car.start(), 'Car is started');
     it('can stop', () => {
     assert.equal(car.stop(), 'Car is stopped');
}

Обратите внимание, что мы используем assert.equal () для проверки того, что выходные данные методов класса соответствуют критериям тестирования, указанным во втором аргументе, в данном случае «Автомобиль запущен» и «Автомобиль остановлен». ).

Полный код тестирования будет выглядеть следующим образом:

const asset require ('assert');
class Car {
     
     start() {
     return 'Car is started';
stop() {
     return 'Car is stopped';
}
let car;
beforeEach( () => {
     car = new Car;
});
describe('Car', () => {
     it('can start', () => {
     assert.equal(car.start(), 'Car is started');
it('can stop', () => {
     assert.equal(car.stop(), 'Car is stopped');
}

После написания сотен строк кода тестирование иногда является утомительной задачей, а иногда в очень большой команде у нас есть привилегия передать наш код QA / Testing для выполнения всех задач тестирования. Однако при работе со смарт-контрактами, где задействованы реальные деньги, иногда нам, как разработчику, необходимо подумать о логике, лежащей в основе того, что мы хотим, и о том, как мы хотим самостоятельно тестировать функции в нашем смарт-контракте.