Caso de prueba de trufa a patrón de retiro de prueba unitaria

¿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.senderdel 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 withdrawfunció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.
    }                   
}

Patrón de retiro

No trufa le proporciona múltiples billeteras (direcciones) para trabajar.

Respuestas (1)

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.senderserá 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.

exactamente, sigo buscando una manera de hacerlo en Javascript.