繁体   English   中英

如何在编写时使用 output 测试 Solidity 代码?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM