Truffle-Testfall zum Unit-Test-Entzugsmuster

Wie kann ich die withdraw()Funktion in einem Trüffel-Javascript-Testfall für den folgenden Vertrag testen?

Das Problem ist, wenn ich die aus demselben Vertrag verwende msg.sender, ist der Vorher- und Nachhersaldo gleich.

withdrawGibt es eine Möglichkeit, einen neuen Testvertrag zu erstellen und damit die Funktion aus dem Javascript-Testfall aufzurufen ?

pragma solidity ^0.4.18;

import "./ConvertLib.sol";

contract MetaCoin {
    mapping (address => uint) balances;

    event NewDeposit(address _from, uint256 _value);

    function MetaCoin() public {
        balances[tx.origin] = 10000;
    }

    function getBalance(address addr) public view returns(uint) {
        return balances[addr];
    }

    function deposit() payable {
        balances[msg.sender] += msg.value;
        NewDeposit(msg.sender, msg.value);
    }

    function withdraw() {

        if ( ! (msg.sender.call.value(balances[msg.sender])() ) ) {
            throw;
        }

        balances[msg.sender] = 0; // Please don't worry about re-entrancy for now.
    }                   
}

Auszahlungsmuster

Stellt Truffle Ihnen nicht mehrere Brieftaschen (Adressen) zur Verfügung, mit denen Sie arbeiten können.

Antworten (1)

Für Ihren Test können Sie einen DepositorWithdrawer-Vertrag erstellen, der Einzahlungen/Auszahlungen von MetaCoin aufrufen kann. Wenn der DepositorWithdrawer-Vertrag MetaCoin anruft, msg.senderist dies die Vertragsadresse.

Der Ablauf würde in etwa so aussehen.

MetaCoin mt = new MetaCoin();
DepositorWithdrawer w = new DepositorWithdrawer();
w.transfer(10 ether);
w.deposit(mt);
// do your assert here
w.withdraw(mt);
// do your assert here

Ich persönlich würde dies lieber als JavaScript-Test durchführen. Dort haben Sie eine bessere Kontrolle darüber, wer die Transaktion sendet, und Sie müssen keine unnötigen Verträge codieren.

genau, immer noch auf der Suche nach einer Möglichkeit, dies in Javascript zu tun.