对于如何使用块菌在testrpc测试客户端上模拟真实的网络条件,有什么建议吗?我有一些功能,可以查看块号,并尝试处理传递时间。有没有人想出一个好办法来测试这类东西?
我想知道是否只是在循环中调用一些空事务,并相应地增加块号。任何关于这些事情的内部运作的信息都将不胜感激。
发布于 2017-05-03 07:24:14
默认情况下,在testrpc中调用的每个事务都会立即被挖掘,并且块高度会增加。当使用命令行选项或--blocktime启动testrpc时,挖掘每个块所需的时间可以设置为-b。
此外,testrpc还提供了一个可以用来操作块高度的自定义rpc方法:
evm_mine:强迫一个街区被开采。不需要参数。一个独立于是否开始或停止采矿的区块。
可以从web3中使用web3.currentProvider.sendAsync()调用Testrpc的自定义方法,如下所示:
web3.currentProvider.sendAsync({
jsonrpc: "2.0",
method: "evm_mine",
id: 12345
}, function(err, result) {
// this is your callback
});发布于 2019-09-03 10:33:33
通过使用自己的包装器,我找到了一种编写时间精确测试的方法:
const { time } = require('openzeppelin-test-helpers');
async function timeIncreaseTo (seconds) {
const delay = 1000 - new Date().getMilliseconds();
await new Promise(resolve => setTimeout(resolve, delay));
await time.increaseTo(seconds);
}我注意到Ganache-cli会在主机切换秒时切换EVM秒。因此,我增加了等待新的秒,然后增加了EVM的时间。因此,我有一个准确的秒来执行所有必要的事务和调用,直到EVM时间将被切换。
用法:
const { time } = require('openzeppelin-test-helpers');
// Skip 10 sec to have exact 1 second
await timeIncreaseTo((await time.latest()).addn(10));
await this.contract.deposit(1000000);
const timeDeposited = await time.latest();
// Skip 1 year
await timeIncreaseTo(timeDeposited.add(time.duration.years(1)).subn(1));
expect(await this.contract.balanceOf(wallet)).to.be.bignumber.equal('1060000'); // +6%
await this.contract.withdrawAll();发布于 2019-08-07 14:45:39
我写了一整篇关于这方面的文章:编写精确的随时间变化的信托测试。
虽然我强烈建议你去看看(其中涉及到一些微妙之处),但下面是一个简短的故事。
在您的项目中执行npm install ganache-time-traveler或复制粘贴以下内容:
const advanceBlockAtTime = (time) => {
return new Promise((resolve, reject) => {
web3.currentProvider.send(
{
jsonrpc: "2.0",
method: "evm_mine",
params: [time],
id: new Date().getTime(),
},
(err, _) => {
if (err) {
return reject(err);
}
const newBlockHash = web3.eth.getBlock("latest").hash;
return resolve(newBlockHash);
},
);
});
};https://ethereum.stackexchange.com/questions/15755
复制相似问题