Created
October 30, 2021 16:23
-
-
Save JackBekket/e37ea32f7a97fb572dade00353878dc9 to your computer and use it in GitHub Desktop.
test js asyncronous notaion example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// General notaion (any approach): | |
// говорим тесту, что мы хотим использовать артефакт контракта MST (mst.json из папки build) | |
const MST = artifacts.require('MST'); | |
// говорим, что файл mst.json это смарт контракт, и что мы хотим использовать аккаунты в этом тесте | |
contract('MST', accounts => { | |
// before -- перед | |
// говорим, что перед прогоном теста мы хотим быть уверены, что MST контракт уже задеплоен, и что мы хотим обращаться к этому контракту | |
// как к токену (прост синтакс. сахар, шоб было удобнее писать) | |
before(async () => { | |
token = await MST.deployed(); | |
}); | |
//BODY OF TEST | |
// После того, как мы удостоверились, что контракт задеплоен можем писать то, что мы хотим затестить | |
// тесты могут писаться либо в нотации async/await либо в .then, примеры ниже | |
// Async / await notaion: | |
// it ('bla-bla', async () => { | |
// it (этот) тест должен делать 'bla-bla' , в асинхронной нотации, а именно => { | |
it('should mint if admin have enough balance', async () => { | |
// let (пусть) adminTokenBalanceBefore = подождать, пока выполнится функция контракта token balanceOf(адрес аккаунта админа для теста) | |
let adminTokenBalanceBefore = await token.balanceOf(admin); | |
// пусть tokensToMint = amount (число которое мы хотим заминтить) * 1^18 (если мы хотим заминтить число равное 1 эфира, то мы его представляем в виде наименьшего значения -- wei., поэтому мы добавляем к нему 18 decimals. если мы хотим заминтить 1$, то мы так же представляем его в центах) | |
let tokensToMint = web3.utils.toWei(web3.utils.toBN(amount)); | |
// проверяем (assert), что значение adminTokenBalanceBefore равно (equal) нулю, и выплевываем в консоль, что это 'current admins token balance' (в консоль выплевывается если тест провален в этом месте, поэтому мы здесь пишем сообщение об ошибке) | |
assert.equal(adminTokenBalanceBefore, 0, 'current admins token balance'); | |
// чек транзакции = подождать, пока выполнится функция контракта token MintERC20(кому (админу), сколько (tokensToMint)) | |
const receipt = await token.MintERC20(admin, tokensToMint); | |
// проверяем, что в чеке транзакции прожегся один эвент | |
assert.equal(receipt.logs.length, 1, 'triggers one event'); | |
// проверяем, что в чеке транзакции, в поле сработавших эвентов сработал эвент с именем 'Transfer' | |
assert.equal(receipt.logs[0].event, 'Transfer', 'should be the Transfer event'); | |
// проверяем, что в чеке транзакции, перевод был осуществлен от адреса самого контракта token | |
assert.equal(receipt.logs[0].address, token.address, 'minted tokens are transferred from'); | |
// пусть admintTokenBalanceAfter = подождать пока выполнится функция контракта token balanceOf(адрес админа) | |
let adminTokenBalanceAfter = await token.balanceOf(admin); | |
// проверяем, что строка adminTokenBalanceAfter равна строке tokensToMint, выплевываем в консоль 'admins token balance after mint' | |
// типа если мы сказали заминтить 10(*1^18) токенов, значит adminTokenBalanceAfter должен быть равен 10(*1^18) | |
assert.equal(adminTokenBalanceAfter.toString(), tokensToMint.toString(), 'admins token balance after mint'); | |
}); | |
// .then нотация | |
// под then у меня нормальных тестов нет, т.к. наш тестировщик ******* и не может в промисы, поэтому я возьму какой-нить пример из моих старых репок | |
// код может быть не совсем рабочий, но я постараюсь передать саму концепцию | |
it("should send coin correctly", function() { | |
// проверить, что контракт токена задеплоен и _потом_ передать его дальше как instance | |
return token.deployed().then(function(instance) { | |
// проверить баланс админа и _потом_ передать его дальше как admin_balance | |
return instance.balanceOf.call(account_one); | |
}).then(function(admin_balance) { | |
account_one_starting_balance = admin_balance.toNumber(); | |
// проверить баланс пользователя (админ аккаунт = accounts[0], пользователь = accounts[1]) и _потом_ передать его дальше как balance2 | |
return instance.balanceOf.call(accounts[1]); | |
}).then(function(balance2) { | |
account_two_starting_balance = balance2.toNumber(); | |
// перевести аккаунту пользователя amount от имени accounts[0] (админа) и __потом__ выполнить следующие действия ничего не передавая дальше | |
return instance.Transfer(accounts[1], amount, {from: accounts[0]}); | |
}).then(function() { | |
return token.balanceOf.call(accounts[0]); | |
}).then(function(balance_admin) { | |
account_one_ending_balance = balance_admin.toNumber(); | |
return token.balanceOf.call(accounts[1]); | |
}).then(function(balance_user) { | |
account_two_ending_balance = balance_user.toNumber(); | |
// проверяем, что баланс админа после перевода = баланс_админа_перед_переводом - сумма_перевода (если нет, то плюемся ошибкой) | |
assert.equal(account_one_ending_balance, account_one_starting_balance - amount, "Amount wasn't correctly taken from the sender"); | |
// проверяем, что баланс пользователя после перевода = баланс_пользователя_перед_переводом + сумма_перевода (если нет, то плюемся ошибкой) | |
assert.equal(account_two_ending_balance, account_two_starting_balance + amount, "Amount wasn't correctly sent to the receiver"); | |
}); | |
}); | |
}); | |
// как можно заметить я располагаю код "лесенкой" или "водопадом", когда пишу в .then | |
// зачем? -- затем, что .then передает результат выполнения предыдущей функции в следующую по списку, таким образом довольно легко представлять себе поток выполнения программы как водопад, таким образом проще писать код | |
// return some_function() | |
// }).then(result_of_some_function) { | |
// return other_function(result_of_some_function) | |
// }).then(result_of_other_function) { | |
// console.log(result_of_other_function) | |
// }); | |
// | |
// преимущество подхода .then в том, что вместо того, что бы говорить JS "запусти эту функцию асинхронно (async), а потом еще вот в этом месте *подожди* пока она выполнится (await) (и повторяем это снова и снова) | |
// мы говорим "вот тебе список дел -- сначала вот это, *потом* вот это, *потом* вот это, а *потом* вот это" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment