我正在嘗試使用 Pytest 來測驗 Python 代碼。我正在測驗的代碼不是一個類,而是同一個檔案中的一堆函式,它們呼叫同一個檔案中的其他函式。例如advanced_function1 呼叫basic_function,advanced_function2 也可以呼叫basic_function。
當我file.basic_function = Mock()
在測驗中時,它不僅限于該測驗。
我可以驗證這一點,因為當我運行模擬 basic_function 的測驗 (test_advanced_function1) 時, test_advanced_function2 沒有通過。但是,如果我只運行 test_advanced_function2 (意味著 basic_function 永遠不會在另一個測驗中被嘲笑),那么它就可以作業。
據我所知,糾正此問題的方法是在 test_advanced_function1 中使用背景關系管理器,并模擬 basic_function 作為該背景關系管理器。我不知道該怎么做。
為了簡化事情并更直接地宣告意圖,我有一個測驗來檢查函式是否是 Mock 物件。
我的檔案.py
def basic_function():
return True
def advanced_function1():
return basic_function()
def advanced_function2():
return not basic_function()
test_myfile.py
from unittest.mock import Mock
import myfile
def test_basic_function(monkeypatch):
assert myfile.basic_function() == True
def test_advanced_function1():
myfile.basic_function = Mock(return_value='foo')
assert myfile.basic_function() == 'foo'
def test_advanced_function2():
assert not isinstance(myfile.basic_function, Mock)
那么,如何在 test_advanced_function1 中使用背景關系管理器來模擬 basic_function?
編輯:澄清一下,我不能將模擬分配為固定裝置,因為有多個測驗用例在我正在處理的真實代碼中運行,并且我無法模擬 Advanced_function1 中的所有斷言的 basic_function。是的,我知道我應該把這個大規模的測驗分解成更小的測驗,但我只是在學習代碼庫,不想在讓他們的所有測驗再次作業之前做太多的改變。
uj5u.com熱心網友回復:
背景關系管理器mock.patch
很少直接在 pytest 中使用。相反,我們使用fixtures。該插件pytest-mock
提供了一個夾具,用于mock.patch
以更“pytest-thonic”的方式使用 API,如下所示:
import pytest
import myfile
def test_basic_function():
assert myfile.basic_function() == True
def test_advanced_function1(mocker):
mocker.patch("myfile.basic_function", return_value="foo")
assert myfile.advanced_function1() == 'foo'
def test_advanced_function2():
assert myfile.advanced_function2() == False
uj5u.com熱心網友回復:
一種可能的解決方案是在背景關系管理器中使用補丁。test_myfile.py
from unittest.mock import patch
from unittest.mock import Mock
import myfile
def test_basic_function(monkeypatch):
assert myfile.basic_function() == True
def test_advanced_function1():
with patch('myfile.basic_function') as basic_function:
basic_function.return_value = 'foo'
assert myfile.basic_function() == 'foo'
def test_advanced_function2():
assert not isinstance(myfile.basic_function, Mock)
但請讓我知道是否有更優雅的方法來做到這一點!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/508591.html
上一篇:關于單元測驗依賴