如何使用松露测试交叉合约调用智能合约?

时间:2016-12-21 13:28:58

标签: solidity truffle smartcontracts

我有两个合同,我在一个文件中写入,名为Sum.sol。和合约调用添加合同。我只想测试交叉契约调用。如果我没有将这两个合同放在一个文件中,使用松露编译Sum就会失败。但是当我进行测试时,结果非常奇怪。我不知道这是怎么发生的。

pragma solidity ^0.4.6;
contract Add{
  function sum(uint x, uint y) returns(uint){
    return x+y;
  }
}
contract Sum{
  function func(uint x, uint y) returns(uint){
    Add add = new Add();
    uint re = add.sum(x,y);
    return re;
  }
}

然后我在松露

中为它写了一个测试
contract('Sum', function(accounts) {
  it("should return 5 when add 2 and 3", function() {
    var sum = Sum.deployed();

    return sum.func.call(2,3).then(function(res){
      assert.equal(res.valueOf(), 5, "add result is 5");

    });
  });
});

然后使用松露进行测试,结果是:

Compiling Sum.sol...


  Contract: Sum
    1) should return 5 when add 2 and 3
    > No events were emitted


  0 passing (455ms)
  1 failing

  1) Contract: Sum should return 5 when add 2 and 3:
     AssertionError: add result is 5: expected   '9.1735649321334958107552852973512799782292704141468709142420585807991067901952e+76' to equal 5
      at /Users/maiffany/testcoverage/test/add.js:6:14
      at process._tickDomainCallback         (internal/process/next_tick.js:129:7)

1 个答案:

答案 0 :(得分:0)

我不确定为什么你的测试3个月前没有工作,因为testrpc和松露从那时起经历了很多变化。在当前状态下,您的测试将失败,因为Sum.deployed()将返回一个promise(您无法直接调用函数)。

我通过以下代码传递了您的测试:

var Sum = artifacts.require("./Sum.sol");

contract('Sum', function(accounts) {
  it("should return 5 when add 2 and 3", function() {
    Sum.deployed().then(function(instance){
      instance.func.call(2,3).then(function(res){
        assert.equal(res.valueOf(), 5, "add result is 5");
      });
    });
  });
})