では、ユニットテストはどのように書くのでしょうか?SolidityとJavaScriptの両方でテストを書くことができるようになりましたが、この2つは完全に互換性があるわけではありません。単純なトークンをテストする例を見てみましょう。 (シンプルなので複雑ではなく、必ずしも簡単ではありません!)github のレポに私の作業を載せていますので、よろしければご覧ください。最初にtruffleとganache-cliをインストールする必要があります。私はTruffle v4.1.11、Solidity v0.4.24、Ganache v6.1.6を使用しており、Mac OS X High Sierra 10.13.6で動作しています。
私の最初のトークンは、次のようなコンストラクタを持っていました。
pragma solidity 0.4.24;contract Mikancoin { uint public totalSupply; mapping (address => uint) public balanceOf; constructor(uint _initialSupply) public { totalSupply = _initialSupply; balanceOf[msg.sender] = _initialSupply; emit Transfer(0x0, msg.sender, totalSupply); }...
そしてmigrations/2_deploy_contracts.jsはこんな感じ。
var Mikancoin = artifacts.require("Mikancoin");module.exports = function(deployer) { deployer.deploy(Mikancoin, 100);};
pragma solidity 0.4.24;
import 'truffle/Assert.sol';
import 'truffle/DeployedAddresses.sol';
import '../contracts/Mikancoin.sol';
contract TestMikancoin {
function testConstructor() public {
// Get the address and cast it
Mikancoin mikan = Mikancoin(DeployedAddresses.Mikancoin());
Assert.equal(mikan.totalSupply(), 100, "Total supply");
Assert.equal(mikan.balanceOf(this), 0, "We have no Mikan");
}
}
function testBadTransfer() public {
MikanFarm farm = MikanFarm(DeployedAddresses.MikanFarm());
Mikancoin mikan = farm.deployMikancoin(100);
Assert.isFalse(mikan.transfer(0x0, 5), "Transfer to 0 address should fail"); // require() fails and therefore this will revert
}