3

昨夜からずっと頭を悩ませていたクイック問題、

私の 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, passed and returned by PassportManager.initPassport(), 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], this_address, "Passport controller, passed and returned by PassportManager.addIDFileToPassport(), should match!");
            assert.equal(returned_tuple[1], doc_hash, "Document hash (bytes32), passed and returned by PassportManager.addIDFileToPassport(), 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, doc_hash, {from: accounts[0]});
            result.on('transactionHash', (hash) => {
                console.log('TxHash', 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

呼び出しが成功しても、何らかの理由でトランザクションを送信しない2 番目のテストに進みます。

Test2 on PassportManager address: 0x871bbABdAeA0721FEB5529A07119edC7f05aB508
what the hell
    ✓ should add an identity file sha256 hash to a controlled passport (58ms)

アサーションは成功しており、コントラクト コールから返された結果がログに記録されwhat the hellsendTransactionますit()

さらに奇妙なのは、3 番目のテストを追加すると、期待どおりに動作することです:テスト ブロックから の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 とイベント データを印刷する前に 3 番目のテストが失敗する)は、おそらくそのようなものを指していますが、ブロックは tx が採掘!console.log()result.on()

4

0 に答える 0