簡體   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