Truffle-Deployment

.deployed() 和 .new() 有何不同?

  • August 22, 2020

當我嘗試在 truffle test javascript 中測試我的契約時,通過instant = await myContract.deployed()and為我的契約創建新的即時有什麼不同instant = await myContract.new()?一樣嗎?看來我必須deployed在 side beforeEach 函式中使用如下,

 beforeEach('for each test...', async function() {
   instant = await myContract.deployed();
 });

每次,要生成新的瞬間然後我必須使用new(),如果我只想在我的每個單元測試中使用相同的瞬間,那麼我必須使用deployed()?如果我錯了,請糾正我。

你說的對。

Truffle 測試來自 truffle-contract deployednew如果您查看文件

deploy():創建代表 MyContract 管理的預設地址的 MyContract 實例。

new():將這個合約的新版本部署到網路,得到一個代表新部署實例的 MyContract 實例。

AFAIK,當您執行時truffle test,最初它將通過您的遷移腳本,並將新合約遷移到您在truffle.js. 當您從 獲取實例時deployed(),您實際上是從這些最初部署的合約之一獲取 javascript 實例。

另一方面,當你從 獲取實例時new(),它會重新將合約部署到網路上,並返回相應的 javascript 實例。

因此,如果您的合約有狀態,並且測試的結果取決於它們執行的順序,那麼您需要使用new()beforeEach 來為各個測試獲取潔淨室環境。

請注意,如果您使用contract()函式,則在執行每個 contract() 函式之前,您的合約將重新部署到正在執行的乙太坊客戶端,因此其中的測試以乾淨的合約狀態執行。

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