如何为 javascript/truffle 中的每个测试创建新的以太坊/solidity 合约

mar*_*aft 3 javascript testing solidity smartcontracts truffle

背景

我用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)
    })
})
Run Code Online (Sandbox Code Playgroud)

我用 运行它truffle test。它基本上是Mocha,但truffle为您定义了artifacts与智能合约的 JavaScript 连接。

truffle的contract功能和Mocha的功能几乎一样describe,有一个我看不懂的小改动!我以为这contract会让我的合同每次都是新的。事实并非如此。也许我可以使用类似的东西new Round()代替Round.deployed(),但我只是不知道如何。

该解决方案不必使用松露。

Zul*_*din 5

请注意,.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]);
  });

});
Run Code Online (Sandbox Code Playgroud)

.new关键字将在新上下文中部署合约实例。

但是,.deployed实际上会使用您之前部署的合约,即当您使用truffle migrate命令时。

在单元测试的背景下,最好使用.new这样你总是从新的合同开始。