как создать новый контракт эфириума / солидности для каждого теста в javascript / truffle - PullRequest
0 голосов
/ 07 октября 2018

background

Я написал умный контракт на ethereum на языке Solidity .Для тестирования я могу запустить локальный узел, используя Ganache , и развернуть на нем свой контракт, используя truffle migrate.

требования

Я хочу проверить свой контрактиспользуя JavaScript.Я хочу создать новый экземпляр моего контракта для каждого теста.

что я пробовал

Я создал тестовый файл tests/test.js в своем проекте:

const expect = require('chai').expect

const Round = artifacts.require('Round')


contract('pledgersLength1', async function(accounts) {
    it('1 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('2 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.Это в основном Мокко , но трюфель определяет для вас artifacts с подключением JavaScript к умным контрактам.

Функция трюфеля contract - это почти то же , что и функция Мокко describe, с небольшим изменением, которое я не понимаю!Я предполагал, что contract сделает мой контракт новым каждый раз.Это не так.Возможно, я могу использовать что-то вроде new Round() вместо Round.deployed(), но я просто не знаю, как.

В решении нет для использования трюфеля.

1 Ответ

0 голосов
/ 09 октября 2018

Обратите внимание, что .new и .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, чтобы вы всегда начинали с нового контракта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...