Solidity

測試不轉移代幣的可靠性轉移方法

  • March 15, 2020

我有這份堅固契約:

contract Token {

 mapping(address => uint256) public balanceOf;

 event Transfer(
   address indexed _from,
   address indexed _to,
   uint256 _value
   );

 constructor(uint256 _initialSupply) public {
   owner = msg.sender;
   balanceOf[msg.sender] = _initialSupply;
   totalSupply = _initialSupply;
 }

 function getTokens() public returns (bool success){
   balanceOf[owner] -= 48;
   balanceOf[msg.sender] += 48;
   emit Transfer(owner, msg.sender, 48);
   return true;
 }


}

當我手動使用 ganache 和 truffle 執行它時,getTokens() 方法可以正常工作。我試圖為它寫一個測試,但它沒有轉移代幣,並告訴我賬戶 1 的餘額為 0。

let ControlToken = artifacts.require("./ControlToken.sol");

contract('ControlToken', function (accounts) {
   it('transfers token ownership', function() {
       return ControlToken.deployed().then(function(instance) {
           let tokenInstance = instance;
           return tokenInstance.getTokens.call({ from: accounts[1] });
       }).then(function(success) {
           assert.equal(success, true, 'it returns true');
           return tokenInstance.balanceOf(accounts[1]);
       }).then(function (balance) {
           assert.equal(balance, 48, "Balance should be 48")
       });

   });
});

當我使用松露測試執行它時,這個測試失敗了。根據Solidity Transfer Token Test Case 無法正常工作。問題可能是我在 getToken 上使用 call() 而不是 send(),但是當我嘗試 send() 時,測試無法辨識該命令。任何幫助將非常感激!

由於您使用的是松露,因此正確的語法是

tokenInstance.getTokens({ from: accounts[1] });

添加.call()將進行呼叫,但任何更改都不會記錄在區塊鏈中。

引用自:https://ethereum.stackexchange.com/questions/80606