我正在完成udemy的python編碼課程,有一個專案,其目錄結構如下:
├──LICENSE
├── README.md
├── __init__.py
├──要求.txt
├── src
│ ├── __init__.py
│ └── milage_converter.py
└──測驗
├── __init__.py
└── milage_converter_test.py
在milage_converter_test.py中,我正在運行一些簡單的測驗:
from py_exercises.src import milage_converter
def test_base_milage_string_to_float(monkeypatch)。
# monkeypatch "input "函式,使其回傳 "10"。。
monkeypatch.setattr('buildins.input', lambda _。"10")
assert milage_converter.get_base_milage(1) == 10.0.
但是這些似乎是在呼叫main()函式,在milage_converter.py。
def get_conversion_direction() 。
""獲取用戶輸入的轉換方向,轉換為浮點數并回傳。""
user_input = input(
"你想從(1)英里轉換為公里還是(2)公里轉換為英里。")
try:
user_input = float(user_input)
except ValueError:
print(
"無效的輸入,選項是1表示Miles to Kilometer或2表示Kilometers to Miles。" )
get_conversion_direction()
while user_input in (1, 2)。
user_input = input(
"你選擇了一個無效的值,請輸入一個1或2的值:")
return user_input
def get_base_milage(unit)。
""獲取用戶輸入的里程數,轉換為浮點數并回傳。""
in_milage = input(f "Please input a value in {unit} to convert: ")
try:
in_milage = float(in_milage)
except ValueError。
print(
"無效的輸入,請輸入一個有效的數值進行轉換。")
# 添加return避免了例外被回傳:。
# https://stackoverflow.com/a/39059651/2816893
return get_base_milage(unit)
return in_milage
def main()。
direction = get_conversion_direction()
if direction == 1:
print(
f "您選擇了{direction},從英里轉換到公里。")
miles = int(get_base_milage("Miles")
print(f"{miles} Miles等于{round(miles * 1. 609344, 2)}")
else:
print(
f "您選擇了{direction},從公里數轉換為英里數。")
kilometers = get_base_milage("kmometers")
print(f"{kilometers} Kilometers is equal to {round(kmometers / 1. 609344, 2)}")
main()
當我從專案目錄中運行pytest時,我被提示輸入,就像我運行了milage_converter.py模塊,如python3.9 milage_converter.py。這就拋出了一個錯誤,即pytest不能捕獲stdin。
------------------------------------------------------------------------------------------ Captured stdout -------------------------------------------------------------------------------------------
你想把從(1)英里轉換為公里或(2)公里轉換為英里。
====================================================================================== short test summary info =======================================================================================
ERROR tests/milage_converter_test.py - OSError: pytest: reading from stdin while output is captured! 考慮使用`-s`。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 中斷。1 采集時出錯 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================================================================== 1 error in 0.10s ==========================================================================================
我期望的是,pytest將簡單地呼叫指定的函式,get_base_milage()并模擬出輸入。如果我在milage_converter.py的第51行注釋掉main(),pytest就會像我期望的那樣運行,所以我覺得我在python中的pytest/mocking方面缺少一些東西。
uj5u.com熱心網友回復:
如果你打算把milage_converter.py作為一個腳本運行,例如python milage_converter.py,那么檢查它是否是__main__是很好的做法,正如檔案中所說:
一個模塊可以通過檢查它自己的名稱來發現它是否在主作用域中運行,這允許一個常見的成語,即當模塊作為腳本或用python -m運行時,有條件地執行模塊中的代碼,但當它被匯入時,則沒有條件執行:
if __name__ == "__main__"/span>。 # execute only if run as a script. main()
所以把這個添加到你的milage_converter.py
...
if __name__ == '__main__'/span>:
main()
你的測驗失敗的原因是,當你通過from py_exercises.src import milage_converter(目前還沒有活動補丁)匯入檔案時,當然會讀取檔案中的代碼。由于你對main()的呼叫就在那里,那么它也會馬上被執行。現在有了這個條件,它將是False,因此不會再執行它。
相關參考:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307317.html
標籤:
