как создать новый контракт ethereum / solidity для каждого теста в javascript / трюфеле

фон

На языке 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 чтобы вы всегда начинали с нового контракта.


Есть идеи?

10000