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.
withdraw
Gibt 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.
}
}
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.sender
ist 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.
Lauri Peltonen