[英]How to test Solidity code w/ output as you are writing it?
我意识到这是一个非常初学者的问题,所以请多多包涵。 我最近开始了我在 Solidity 中的第一个项目,仅使用 Python。 在使用 Python 时,我不断注入打印语句来检查我的工作的 output 并确保一切都按计划进行。
我在使用 Solidity 复制相同的工作流程时遇到了巨大的困难。 Even on the IDE front, I used PyCharm with Python which has a run command and output window but I can't find anything comparable Solidity. 我正在使用 Sublime Text,但这似乎对编写实际代码很有用,而且我找不到将函数/映射等调用到 window 以检查 output 的方法。
Remix 的功能比大多数都多,但我更喜欢本地开发环境。 我已经找了一段时间了,感觉我找错了地方,不知道为什么对于一个看似简单的问题很难找到答案。 任何洞察力都会令人惊叹。
谢谢!
Solidity 没有命令行 output 来显示调试值。 这可以说服您编写遵循 单一职责原则的更简单的函数,并分别测试它们的输入/输出。
因此,与其写一个长的 function 来做所有事情,而且很难知道执行过程中发生了什么
function transfer(uint256 _tokenId) external {
require(msg.sender == ownerOf(_tokenId)
|| isApprovedForAll(ownerOf(_tokenId), msg.sender)
|| msg.sender == getApproved(_tokenId), 'Sender not allowed');
if (approved != address(0x0)) {
tokenApprovals[_tokenId] = address(0x0);
emit Approval(_tokenOwner, address(0x0), _tokenId);
}
// ... etc
}
您可以将功能分解为更小的部分(更容易单独测试)。 如果需要,您可以将它们连接到一个 function 中。
function transfer(uint256 _tokenId) {
address tokenOwner = ownerOf(_tokenId);
address approved = getApproved(_tokenId);
require(isSenderAllowed(_tokenId, tokenOwner, approved), 'Sender not allowed');
if (approved != address(0x0)) {
_removeApproval(_tokenId, tokenOwner);
}
// ... etc
}
function isSenderAllowed(uint256 _tokenId, address _tokenOwner, address _approved) external view returns (bool) {
return (msg.sender == _tokenOwner
|| isApprovedForAll(_tokenOwner, msg.sender)
|| msg.sender == _approved);
}
function _removeApproval(uint256 _tokenId, address _tokenOwner) private {
tokenApprovals[_tokenId] = address(0x0);
emit Approval(_tokenOwner, address(0x0), _tokenId);
}
一个小的调试解决方法(在本地区块链上,例如 Ganache 或 Remix VM 模拟器上)可以使用事件日志。 您可以在交易返回 object 中看到它们(如果未还原 tx)。 但是,这不是一个好习惯,我仍然建议您编写尽可能简单的函数,这样您就不必进行太多调试。
contract MyContract {
event LogString(string memory _value);
event LogAddress(address _value);
function foo() external {
emit LogString("myString");
emit LogAddress(address(0x123));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.