如何解决松露测试似乎没有在“成功”之前完成,并且不会等待发送的 tx
从昨晚开始我就一直头疼的问题,
我的 truffle (v5.2.3) 测试文件执行两 (2) 个测试,依次call()
然后实际发送交易以对我的智能合约的存储进行持久更改。这些测试如下(对于转储的文件很抱歉,我已经尽可能地最小化了):
const PassportManager = artifacts.require("PassportManager");
contract("PassportManager",accounts => {
it("should initialize a new passport linked with the current user's address",() => {
let this_address = accounts[0];
let this_nickname = "John Doe";
let Meta;
return PassportManager.deployed()
.then(instance => {
Meta = instance;
console.log("Test1 on PassportManager address: " + Meta.address);
return Meta.initPassport.call(this_nickname);
})
.then(returned_tuple => {
assert.equal(returned_tuple[0],this_nickname,"Nickname,passed and returned by PassportManager.initPassport(),should match!");
assert.equal(returned_tuple[1],this_address,"Controller address,should match!");
//If we're here,it means the prevIoUs call() has succeeded. Now,//let's take things up a notch and let's actually send a transaction that changes the state of the blockchain.
//Remember: We can't check for return values with a transaction,we have to debug the tx id manually.
//#NOTE: We passed an extra parameter here. For more info on this special parameter object,check out:
//https://www.trufflesuite.com/docs/truffle/getting-started/interacting-with-your-contracts#making-a-transaction
const result = Meta.initPassport.sendTransaction(this_nickname,{from: accounts[0]});
result.on('transactionHash',(hash) => {
console.log('TxHash',hash);
});
});
});
it("should add an identity file sha256 hash to a controlled passport",() => {
let this_address = accounts[0];
let doc_hash = "0x21f3a9de43f07d855f49b946a10c30df432e8af95311435f77daf894216dcd41";
let Meta;
return PassportManager.deployed()
.then(instance => {
Meta = instance;
console.log("Test2 on PassportManager address: " + Meta.address);
return Meta.addIDFiletoPassport.call(this_address,doc_hash);
})
.then(returned_tuple => {
assert.equal(returned_tuple[0],"Passport controller,passed and returned by PassportManager.addIDFiletoPassport(),doc_hash,"Document hash (bytes32),should match!");
assert.equal(returned_tuple[2],1,"Trust score of newly added doc_hash should be 1!");
//Now let's actually pass a concrete,actuallly persistent transaction instead of a call.
const result = Meta.addIDFiletoPassport.sendTransaction(this_address,hash);
});
console.log("what the hell");
});
});
/*it("return false",() => {
assert(0==1);
});
*/
});
第一个测试调用,然后发送一个交易就好了!在我每次运行 truffle test
时,我都会在控制台中获得不错的预期日志结果:
Test1 on PassportManager address: 0x871bbABdAeA0721FEB5529A07119edC7f05aB508
✓ should initialize a new passport linked with the current user's address (71ms)
TxHash 0x0760cb2738da2a21cc404e0627e1008599fe81f2c3a6914a1b06ff712dc8adca
现在它继续进行第二次测试,由于某种原因它不发送交易,即使调用成功!
Test2 on PassportManager address: 0x871bbABdAeA0721FEB5529A07119edC7f05aB508
what the hell
✓ should add an identity file sha256 hash to a controlled passport (58ms)
断言成功,我的合约调用返回的结果被记录,我们甚至到达了BELOW的沮丧的小what the hell
,但我从来没有得到类似于第一个 sendTransaction
测试的发送交易的 TxHash!
更奇怪的是,如果我添加第三个 it()
测试,它会按预期工作:
从我的测试块中取消对 it()
的注释,然后瞧瞧:
it("return false",() => { assert(0==1); });
从昨天开始,我就一直在纠结这个问题,我闻到了某种并发/时间问题。有没有办法控制发送交易的顺序,或者等待一个交易被提交和挖掘,然后再继续测试?
打印 Test2 on PassportManager address: 0x87465190eCBa7C287143f07653462a87464b1AbA
what the hell
✓ should add an identity file sha256 hash to a controlled passport (119ms)
1) return false
TxHash 0x9226311347487d294b0bcf5bc1f535636fe886f08dfa327f15de43318aad37d7
Events emitted during test:
---------------------------
/* I even get proper emitted event data from my contract! */
---------------------------
s 的奇怪序列(例如,在测试 2 之前的第三个测试失败实际上打印出 txHash 和事件数据) 可能指向类似的东西,但我认为console.log()
块将确保我们正在等待 tx 被挖掘!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。