Solidity
測試不轉移代幣的可靠性轉移方法
我有這份堅固契約:
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()
將進行呼叫,但任何更改都不會記錄在區塊鏈中。