Testrpc

松露測試錯誤:setter 不起作用

  • October 2, 2017

我有這樣的非常基本的契約:

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() 方法。

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