Contract-Design
在測試時使用 truffle 部署合約
我無法在松露中設置我的測試工具。我有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)
這裡有一個程式碼範例
beforeEach()
:Truffle Smart Contract Testing does not reset state一般的想法,測試為測試部署新的合約實例
it()
。您可以使該模式適應各種情況。
希望能幫助到你。