¿Cómo puedo probar la withdraw()
función en un caso de prueba de javascript de trufa para el siguiente contrato?
El problema es que, si uso el msg.sender
del mismo contrato, el saldo anterior y posterior será el mismo.
¿Hay alguna manera de crear un nuevo contrato de prueba y usarlo para llamar a la withdraw
función desde el caso de prueba de JavaScript?
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.
}
}
Para su prueba, puede crear un contrato de DepositorWithdrawer capaz de solicitar depósitos/retiros de MetaCoin. Cuando el contrato DepositanteRetirador llame a MetaCoin, msg.sender
será la dirección del contrato.
El proceso sería algo como esto.
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
Personalmente, preferiría hacer esto como una prueba de JavaScript. Allí tiene un mejor control sobre quién envía la transacción y no tiene que codificar contratos innecesarios.
Lauri Peltonen