Как я могу протестировать 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.
}
}
Для вашего теста вы можете создать контракт 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. Там вы лучше контролируете, кто отправляет транзакцию, и вам не нужно кодировать ненужные контракты.
Лаури Пелтонен