Contract-Design

在測試時使用 truffle 部署合約

  • July 29, 2021

我無法在松露中設置我的測試工具。我有2份契約。第一個是頒發機構,為了部署第二個,創建地址必須在第一個註冊。我很難弄清楚如何通過松露測試最好地做到這一點,因為我無法部署合約而不會在我的遷移中失敗,因為合約創建程式碼會拋出(如預期的那樣)。

我在我的遷移程式碼中嘗試了以下內容,但“我在這裡”評論從未被擊中。我想這是因為我真的沒有足夠的空間來做這件事,而且無論如何這都是沒有實際意義的,因為每個測試都會創建自己的小沙盒。

var IssuingAuthority = artifacts.require("./IssuingAuthority.sol");
var CitizenAccount = artifacts.require("./CitizenAccount.sol");

module.exports = function(deployer) {
 console.log('about to deploy')
 deployer.deploy(IssuingAuthority).then(function(){
   console.log('about to deplyoy 2');
   IssuingAuthority.deployed().then(function(instance){
     console.log('about to call add citizen');
     instance.addCitizen.call(accounts[1]).then( function(result){
       console.log('here i am');
       console.log(result);
       deployer.link(IssuingAuthority, CitizenAccount);
       console.log(IssuingAuthority.address);
       deployer.deploy(CitizenAccount,IssuingAuthority.address);
     });

   });
 });
}

我想知道我是否可以在測試中訪問部署程序,以便我可以在測試時將我的契約部署到網路。像這樣的東西:

 var IssuingAuthority = artifacts.require("./IssuingAuthority.sol");
 var CitizenAccount = artifacts.require("./CitizenAccount.sol");

 contract('CitizenAccount', function(accounts) {
   it("should be authorized", function() {

     var ia = null;
     return IssuingAuthority.deployed().then(function(instance) {
       ia = instance;
       return instance.addCitizen.call(accounts[1]);
     }).then(function(result) {
       assert.equal(result, true, "citizen wasnt added");
     ///////////////////
     // I need to do a deployment here now that the issuer contract 
     // has the address I want.
     /////////////////////////

       return CitizenAccount.deployed(ia.address);
     }).then(function(caInstance){

     });

   });

 });

這是我的公民帳戶契約的程式碼。如果這不起作用,請隨時向我指出一個更好的模式:

pragma solidity ^0.4.2;

import "./IssuingAuthority.sol";

contract CitizenAccount {
 address public issuingAuthority;
 address owner;

 function CitizenAccount(address _issuingAuthority) {
   IssuingAuthority i = IssuingAuthority(_issuingAuthority);
   bool isCitizen = i.isCitizen(msg.sender);
   if(isCitizen){
     issuingAuthority = _issuingAuthority;
   }
   else{
     throw;
   }
 }

}

如果我理解正確,您希望在測試期間而不是在遷移(初始部署)階段部署契約。

您可以使用測試腳本中的合約抽象來執行此操作,如下所示

var contractInstance = MyContract.new([contructorParam1], {data: ...});

或者在你的情況下:

CitizenAccount.new(ia.address)

與此相關的 Web3 文件

這裡有一個程式碼範例beforeEach()Truffle Smart Contract Testing does not reset state

一般的想法,測試為測試部署新的合約實例it()

您可以使該模式適應各種情況。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/15670