Тестовый пример Truffle для шаблона вывода модульного теста

Как я могу протестировать withdraw()функцию в тестовом примере трюфельного javascript для приведенного ниже контракта?

Проблема в том, что если я использую msg.senderодин и тот же контракт, баланс до и после будет одинаковым.

Есть ли способ создать новый тестовый контракт и использовать его для вызова withdrawфункции из тестового примера 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.
    }                   
}

Модель вывода

truffle не предоставляет вам несколько кошельков (адресов) для работы.

Ответы (1)

Для вашего теста вы можете создать контракт DepositorWithdrawer, способный вызвать ввод/вывод средств из MetaCoin. Когда контракт DepositorWithdrawer вызывает MetaCoin, msg.senderбудет адресом контракта.

Процесс будет выглядеть примерно так.

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

Лично я бы предпочел сделать это как тест JavaScript. Там вы лучше контролируете, кто отправляет транзакцию, и вам не нужно кодировать ненужные контракты.

точно, все еще ищу способ сделать это в Javascript.