Solidity

如何在松露中測試具有多個帳戶/地址的合約?

  • December 3, 2021

我想用多個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。

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