如何在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()
的迷雾。