Testrpc
松露測試錯誤:setter 不起作用
我有這樣的非常基本的契約:
pragma solidity ^0.4.0; contract Playground { uint public tokenPrice = 1; function setTokenPrice(uint newTokenPrice) public returns (uint) { tokenPrice = newTokenPrice; return tokenPrice; } }
和對應測試:
it("should have token price changeable and publicly visible", () => { let instance; return Playground.deployed().then(inst => { instance = inst; return instance.tokenPrice.call(); }).then(price => { console.log('Initial price:' + formatNumber(price)); return instance.setTokenPrice.call(2); }).then(price => { console.log('Price immediately after change:' + formatNumber(price)); return instance.tokenPrice.call(); }).then(price => { console.log('Price after get:' + formatNumber(price)); assert.equal(price, 2, format(price, 2, "Token Price")); }); });
該測試檢查代幣價格的初始值,然後更改它並再次檢查。但似乎setter不起作用!這是輸出:
Initial price:1 Price immediately after change:2 Price after get:1
即在 setter 中更新的值正確返回,但是當我再次獲取它時 - 它返回舊的,未更新的值。這裡有什麼問題?
測試正在本地
testrpc
實例中執行。在 Remix 中,數據按預期更新。
您在打算在區塊鏈上寫入的函式上使用 .call() 呼叫 setTokenPrice 函式。當你想從合約中讀取數據時使用 call() 方法。