Skip to content

Instantly share code, notes, and snippets.

@JackBekket
Created October 30, 2021 16:23
Show Gist options
  • Save JackBekket/e37ea32f7a97fb572dade00353878dc9 to your computer and use it in GitHub Desktop.
Save JackBekket/e37ea32f7a97fb572dade00353878dc9 to your computer and use it in GitHub Desktop.
test js asyncronous notaion example
// 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