Web3.py

布朗尼:假設給定()沒有為每個函式呼叫重置鏈

  • May 18, 2020

我的巧克力蛋糕項目中有以下測試程式碼片段:

from hypothesis import settings, given, strategies as st
from brownie import *
import brownie

st_buy_amount_eth = st.integers(min_value=int(Wei("1 gwei")), max_value=int(Wei("10 ether")))

@given(buy_amount=st_buy_amount_eth)
@settings(max_examples=20)
def test_buy_lgt_atleast_for(lgt, accounts, buy_amount):
   print(web3.eth.blockNumber)
   token_amount = buy_amount_to_tokens(buy_amount)  # hard-coded function to verify the math
   if token_amount >= 1:
       tx = lgt.buyLgtAtLeastFor(1, 99999999999, accounts[3], {'from': accounts[2], 'value': buy_amount})
       assert tx.return_value == token_amount
       assert lgt.balanceOf(accounts[3]) == token_amount
   else:
       with brownie.reverts("dev: not enough eth to buy tokens"):
           liquidLgt.buyLgtAtLeast(1, 99999999999, {'from': accounts[2], 'value': buy_amount})

當使用列印輸出執行測試時,brownie test -s對於每個帶有假設的範例,我得到的結果要高一個塊,並且我從假設中得到不一致的結果錯誤。

有沒有辦法設置它,所以假設會為每個範例正確重置鏈?那太棒了,我真的希望能得到與布朗尼一起工作的假設!

您需要@given從 Brownie 導入,而不是直接從假設導入:

from brownie.test import given

這是必需的,因為 Brownie 通過夾具處理隔離,但功能範圍內的夾具每次測試僅執行一次(而不是每次執行一次)。從假設文件

…每個夾具將為整個功能執行一次,而不是每個範例一次。

Brownie 通過將測試包裝在執行鏈倒帶的函式中解決了這個問題。您可以在原始碼中看到它在此處處理。

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