繁体   English   中英

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

[英]how to create new ethereum/solidity contract for each test in javascript/truffle

背景

我已经写在了复仇的智能合同密实度的语言。 为了测试的东西,我可以使用运行本地节点伽纳彻和使用上我的合同部署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运行它。 它基本上是Mocha ,但是松露通过与智能合约的JavaScript连接为您定义artifacts

松露contract功能几乎与 Mocha的describe功能相同 ,只是有一点我不明白的变化! 我以为contract每次都会使我的合同更新。 没有。 也许我可以使用诸如new Round()类的东西来代替Round.deployed() ,但是我只是不知道如何。

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

请注意, .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以便您始终从新合同开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM