Solidity
如何在松露中測試具有多個帳戶/地址的合約?
我想用多個
msg.sender
地址測試我的松露合約。就像“第一個使用者賣出代幣,第二個使用者購買這個代幣”。對於一個地址,我只需寫類似contract.buy.value(10 wei)();
. 但是我在哪裡可以獲得另一個地址以及如何從他那裡匯款?我在solidity 上編寫測試,而不是在javascript 上。
是的,你可以,用 Javascript 進行測試。
在您的測試中,您可以像這樣初始化它:
const MyContract = artifacts.require('MyContract'); contract('MyContract', accounts => { const owner = accounts[0]; const alice = accounts[1]; const bob = accounts[2]; it('should do something', async () => { const contract = await MyContract.deployed(); await contract.buy(price, data, { from: alice }); await contract.buy(price, data, { from: bob }); assert.equal(...); }); });
注意帳戶變數。希望這可以幫助。
合約也是賬戶!非常有用的模式:
首先,我們創建我們喜歡的實際事物。
pragma solidity ^0.8.10; contract Thing { address public owner; uint argument; modifier restricted() { require(msg.sender == owner); _; } constructor (uint _argument) { owner = msg.sender; argument = _argument; } function doThing() public restricted {} }
然後我們製造一個東西來製造,從而擁有更多的東西。
// test/ThingMaker.sol (truffle only runs // files beginning with Test but you could // put it somewhere else too) pragma solidity ^0.8.10; import "../contracts/Thing.sol"; contract ThingMaker { function makeThing(uint argument) public returns (Thing) { Thing thing = new Thing(argument); return thing; } }
最後,我們對事物進行了測試,它可以使用他們擁有或不擁有的任意數量的事物(
Thing[] preOwnedThingArray
如果你願意,你可以做一個)。所有測試通過!請務必使用實際的錯誤消息。// test/TestThing.sol pragma solidity ^0.8.10; import "../contracts/Thing.sol"; import "./ThingMaker.sol"; contract TestThing { Thing preOwnedThing; function beforeEach() public { uint arg = 123; ThingMaker maker = new ThingMaker(); preOwnedThing = maker.makeThing(arg); } function testOwnerCanDoThing() public { uint arg = 123; Thing thing = new Thing(arg); thing.doThing(); } function testNonOwnerCannotDoThing() public { try preOwnedThing.doThing() { assert(1==2); } catch {} } }
現在這涵蓋了 0 和 1 非特權賬戶的情況——如果你想與一個包含一堆賬戶的合約進行互動,你可以翻轉腳本並創建一個
ThingInteractor.sol
,但恐怕你可能不得不做該契約中的單獨功能(也許有一些魔法可以避免這種情況,如果我能想到一些,必須嘗試記住回复你)與你喜歡的任何東西進行互動,然後按需創建新的 ThingInteractors。