Solidity

如何對結構值進行單元測試

  • June 12, 2018

我是 Solidity 開發的新手,我正在嘗試找出測試在我的 Truffle 環境中設置結構值的函式的最佳方法。

首先,是否期望 promise 的結果以以下格式返回:

[ BigNumber { s: 1, e: 0, c: [ 5 ] }, 'John' ]

如果是這樣,那麼測試正確屬性的正確模式是否已由 setter 方法設置(在本例中為名稱:John): assert.equal(res[1], "John");

有關我正在嘗試測試的範例契約,請參見下文:

./contracts/Adoption.sol:

contract Adoption {

struct Dog {
   uint age;
   string name;
}

Dog[] public dogs;

function createDog(uint _age, string _name) public {
   dogs.push(Dog(_age, _name)) - 1;
}        

}

./test/Adoption.js

return Adoption.deployed()
 .then(function(instance) {
   instance.createDog(5, "John");
   return instance.dogs(0);
 })
 .then(function(res) {
   // dog age should equal 5
   assert.equal(res[0], 5);
   // dog name should equal John
   assert.equal(res[1], "John");
 });

不幸的是,結構不是最初的 Solidity ABI 規範的一部分,因此它們將返回一個值元組。

另一個問題是 javascript 不支持具有足夠精度的整數。為避免失去精度或舍入錯誤等問題,web3 會將整數包裝到對像中BigNumber,請參閱消息呼叫返回對像中的 CES 屬性是什麼?有關其他詳細資訊。

要比較BigNumbers,您可以將它們轉換為普通的 javascripts 數字.toNumber()(這只適用於小整數https://stackoverflow.com/questions/307179/what-is-javascripts-highest-integer-value-that-a-number- can-go-to-without-losin),對於大量可能最好轉換為字元串或使用BigNumber庫中的一些方法。

return Adoption.deployed()
 .then(function(instance) {
   instance.createDog(5, "John");
   return instance.dogs(0);
 })
 .then(function(res) {
   // dog age should equal 5
   assert.equal(res[0].toNumber(), 5);
   // dog name should equal John
   assert.equal(res[1], "John");
 });

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