DeployedAddresses + Error: VM Exception while processing transaction: revert

DeployedAddresses + Error: VM Exception while processing transaction: revert

我有如下合同 -

文件名:dummycontrat.sol

pragma solidity ^0.4.17;

contract DummyContract {

    function fetchRandomNumber() public pure returns(uint) {
        uint res = 10;
        return res;
    }

}

我有以下测试文件-

文件名:test/TestDummyContract.sol

pragma solidity ^0.4.17;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/dummycontract.sol";

    contract TestDummyContract {

        function testRandomNumberNew() public {
            DummyContract dummyContract = new DummyContract();
            uint randomNumber = dummyContract.fetchRandomNumber();
            Assert.equal(randomNumber, 10, "Number is not 10");
        }

        function testRandomNumberDeployed() public {
            DummyContract dummyContract = DummyContract(DeployedAddresses.DummyContract());
            uint randomNumber = dummyContract.fetchRandomNumber();
            Assert.equal(randomNumber, 10, "Number is not 10");
        }

    }

我运行命令-

truffle compile && truffle migrate --reset --network dev && truffle test --network dev test/TestDummyContract.sol

第一个测试通过,而第二个测试出错。来自 truffle test 命令的日志如下 -

TestDummyContract
    ✓ testRandomNumberNew (53ms)
    1) testRandomNumberDeployed
    > No events were emitted


  1 passing (894ms)
  1 failing

  1) TestDummyContract testRandomNumberDeployed:
     Error: VM Exception while processing transaction: revert
      at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:38:1)
      at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
      at /usr/local/lib/node_modules/truffle/build/webpack:/~/truffle-provider/wrapper.js:134:1
      at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
      at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
      at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
      at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
      at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:469:1)
      at endReadableNT (_stream_readable.js:974:12)
      at _combinedTickCallback (internal/process/next_tick.js:80:11)
      at process._tickCallback (internal/process/next_tick.js:104:9)

谁能解释一下这里的问题是什么?我在 OSX 上为网络 运行ning Ganache 工具。

DeployedAddresses.DummyContract() 失败,因为只有包含在 Truffle 部署配置中的合同才可用于 DeployedAddresses。来自 Truffle documentation:

The addresses of your deployed contracts (i.e., contracts that were deployed as part of your migrations) are available through the truffle/DeployedAddresses.sol library. This is provided by Truffle and is recompiled and relinked before each suite is run to provide your tests with Truffle's a clean room environment. This library provides functions for all of your deployed contracts, in the form of:

DeployedAddresses.<contract name>();

要解决您的问题,您需要在 /migrations 下创建部署配置(或添加到现有配置,如果有的话)。例如:

2_deploy_contracts.js:

var DummyContract = artifacts.require("dummycontract");

module.exports = function(deployer) {
  deployer.deploy(DummyContract);
};

添加该配置,重新运行 truffle migrate --reset 然后您的测试就会成功。