我有一個main.py檔案,其中包括WindoMgr類、xvfb作為類屬性和兩個類方法:_cleanup_lock_file和func_to_test。我只有在測驗else塊時遇到問題,當cls.xvfb為None時會觸發它。else 塊回傳b的默認值,即 1。
#main.py
class WindowMgr:
xvfb = None
@classmethod
def _cleanup_lock_file(cls):
return True
@classmethod
def func_to_test(cls):
b = 1
if cls.xvfb is not None:
print(cls.xvfb) #<MagicMock name='xvfb' id='61908568'>
try:
cls.xvfb.terminate()
b = 2
except Exception:
b = 1 2
finally:
cls._cleanup_lock_file()
else:
return b
return b
現在,在test_main.py檔案中,我已經修補了try 塊中的xvfb模擬cls.xvfb.terminate(),但我希望cls.xvfb為None以觸發else塊。我嘗試過類似的東西xvfb = Noneor xvfb.return_value = None。但是 else 塊不會被觸發,因為列印cls.xvfb將其顯示為MagickMock代碼中注釋掉的物件。回傳值為 2而WindowMgr.func_to_test()不是 1。它應該將 b 的默認值回傳為 1。如何將cls.xvfb模擬物件設定為None?任何幫助,將不勝感激。
#test_main.py
from main import WindowMgr
def test_main_func(mocker):
xvfb = mocker.patch.object(WindowMgr, 'xvfb')
# To test the else block
# xvfb = None -----> doesn't work
# xvfb.return_value = None ----> doesn't work
assert WindowMgr.func_to_test() == 1 # AssertionError: assert 2 == 1
uj5u.com熱心網友回復:
問題是設定xvbf只重新分配區域變數,而不是模擬變數(這只是正常的 Python 行為)。設定return_value不起作用,因為xvbf不是可呼叫的。但是,如果您使用屬性模擬而不是常規模擬,它將表現得好像它是可呼叫的,并且可以通過以下方式設定值return_value:
def test_main_func(mocker):
xvfb = mocker.patch.object(WindowMgr, "xvfb",
new_callable=mocker.PropertyMock)
xvfb.return_value = None
assert WindowMgr.func_to_test() == 1
(為了方便,您可以PropertyMock直接訪問)mocker
即使xvbf是類變數而不是屬性,從模擬的角度來看,它的行為就像一個屬性,這將起作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430882.html
標籤:Python 单元测试 嘲弄 pytest pytest 模拟
上一篇:lateinit屬性apiInterface尚未初始化kotlin.UninitializedPropertyAccessException:?
下一篇:亂數的單元測驗
