Solidity
如何對結構值進行單元測試
我是 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
,請參閱消息呼叫返回對像中的 C、E 和 S 屬性是什麼?有關其他詳細資訊。要比較
BigNumber
s,您可以將它們轉換為普通的 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"); });