如何在javascript/truffle中为每个测试创建新的以太坊/实体合同 背景

如何在javascript/truffle中为每个测试创建新的以太坊/实体合同 背景,javascript,testing,solidity,smartcontracts,truffle,Javascript,Testing,Solidity,Smartcontracts,Truffle,我已经用这种语言编写了以太坊智能合约。为了进行测试,我可以使用运行本地节点,并使用truffle migrate在其上部署契约 要求 我想用JavaScript测试我的合同。我想为每个测试创建一个新的契约实例 我试过的 我在我的项目中创建了一个测试文件tests/test.js: const expect = require('chai').expect const Round = artifacts.require('Round') contract('pledgersLength1',

我已经用这种语言编写了以太坊智能合约。为了进行测试,我可以使用运行本地节点,并使用
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)
    })
})
我使用
块菌测试运行它。它基本上是,但通过与智能合约的JavaScript连接为您定义了
工件

块菌
合同
的功能与摩卡的
功能相同,只是有一个小小的变化,我不明白!我认为,
合同
每次都会使我的合同成为新合同。没有。也许我可以使用类似于
newround()
的东西来代替
Round.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
,这样您将始终从新的契约开始。

您确定它不是相同的契约吗?在他们的网站上,他们声称这将是每个
description
功能中的一个新合同实例。你怎么知道这是同一个实例呢?查看这个推特帖子-@nikosfotiadis,我敢肯定。我所知道的方式可能与这个问题无关,但如果你试图两次保证相同的金额,合同就会出错。因此,在我上面键入的示例中,当我希望不会得到错误时,我得到了一个错误。@ZulhilmiZainudin是的,使用
.new()
而不是
。deployed()
非常有效!这确实应该添加到块菌文档中。你能把它作为一个答案贴出来吗?我很高兴它有帮助。我已经公布了我的答案。如果你能投票并接受它,我将不胜感激。这是一个很好的答案,它消除了
new()
deployed()
的迷雾。