На языке Solidity я написал смарт-договор ethereum. Чтобы проверить что-то, я могу запустить локальный узел с помощью Ganache и развернуть мой контракт, используя truffle migrate
.
Я хочу проверить свой контракт с помощью JavaScript. Я хочу создать новый экземпляр моего контракта для каждого теста.
Я создал тестовый файл test tests/test.js
в своем проекте:
const expect = require('chai').expect
const Round = artifacts.require('Round')
contract('pledgersLength1', async function(accounts) {
it(Ƈ pledger', async function() {
let r = await Round.deployed()
await r.pledge(5)
let len = (await r.pledgersLength()).toNumber()
expect(len).to.equal(1)
})
})
contract('pledgersLength2', async function(accounts) {
it(ƈ pledgers', async function() {
let r = await Round.deployed()
await r.pledge(5)
await r.pledge(6)
let len = (await r.pledgersLength()).toNumber()
expect(len).to.equal(2)
})
})
Я запускаю его с truffle test
. Это в основном Mocha , но трюфель определяет artifacts
для вас с подключением JavaScript к смарт-контрактам.
contract
функция трюфеля почти такая же, как функция describe
Mocha, с небольшим изменением, которое я не понимаю! Я предположил, что contract
будет каждый раз подводить мой контракт. Это не так. Возможно, я могу использовать что-то вроде new Round()
вместо Round.deployed()
, но я просто не знаю, как это сделать.
Решение не обязательно использовать трюфель.
Всего 1 ответ
Обратите внимание, что .deployed
и .deployed
не совпадают. Посмотрите, что я нашел здесь .
Следуйте этому примеру, и он должен решить вашу проблему:
// Path of this file: ./test/SimpleStorage.js
var simpleStorage = artifacts.require("./SimpleStorage.sol");
contract('SimpleStorage', function(accounts) {
var contract_instance;
before(async function() {
contract_instance = await simpleStorage.new();
});
it("owner is the first account", async function(){
var owner = await contract_instance.owner.call();
expect(owner).to.equal(accounts[0]);
});
});
Ключевое слово .new
будет развертывать экземпляр вашего контракта в новом контексте.
Но .deployed
фактически использует контракт, который вы развернули ранее, т.е. когда вы используете команду truffle migrate
.
В контексте модульного теста лучше использовать .new
чтобы вы всегда начинали с нового контракта.