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(),但我只是不知道如何。
该解决方案不必使用松露。
请注意,.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这样你总是从新的合同开始。
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |