我有一个像下面这样的合约函数
function updateDeps(uint16 parent, uint16[] calldata deps) public
和我试图创建单元测试与以下
的混音contract TestContract is MyContract {
uint16[] deps;
function testUpdateDeps() {
deps.push(uint16(2));
deps.push(uint16(3));
deps.push(uint16(4));
(bool success, bytes memory result) = address(this).delegatecall(abi.encodeWithSignature("updateDeps(uint16, uint16[])", 1, deps));
Assert.ok(success, "should succeed");
}
}
我这样写测试是因为固定大小数组和动态数组之间的差异,并且calldata
不能是契约变量,只能在函数调用中创建,因此delegatecall
。然而,事务失败。
如何测试以calldata
动态数组为参数的函数?
使用abi编码字符串,字符串中的参数之间不能有空格,即updateDeps(uint16,uint16[])
可以工作但updateDeps(uint16, uint16[])
不能
注:一个额外的提示,如果你在代码中使用uint
,它是uint256
的别名,在abi签名字符串中你必须指定uint256
,而不是uint
。