假設有一個功能download_page_html(url)
,它下載由(有效)url
指向的頁面的HTML內容。各種功能使用它download_page_html
做他們的工作。如何攔截函數調用並用pytest更改參數?
現在,測試時我不想從維基百科下載HTML,而是從本地主機下載。
那麼如何攔截各種函數調用download_page_html
並替換url參數的值呢?
假設有一個功能download_page_html(url)
,它下載由(有效)url
指向的頁面的HTML內容。各種功能使用它download_page_html
做他們的工作。如何攔截函數調用並用pytest更改參數?
現在,測試時我不想從維基百科下載HTML,而是從本地主機下載。
那麼如何攔截各種函數調用download_page_html
並替換url參數的值呢?
使用Python的stdlib unittest.mock.patch
- 它既可以作爲裝飾器使用,也可以作爲上下文管理器使用(即使用with
語句)。
如果您在new
關鍵字參數傳遞,功能pacthed到 - 你只要把一個班輪調用與 參數原有的功能選擇:
from unittest.mock import patch
from mymodule import download_page_html as original_download_page
@patch('mymodule.download_page_html', new=lambda page: original_download_page("http://localhost/page.html"))
def test_my_test_function(...):
...
您應該添加一個可選dph=None
參數傳送給「各種功能」,然後在函數體重新分配,如果有必要的硬編碼download_page_html
功能:
def my_various_function(url, arg2, kw1=val1, dph=None):
if dph is None:
dph = download_page_html
res = dph(url)
如果你不認爲你的設計令蘇CH的改變,使用內置monkeypatch
pytest
的:
import pytest # no need to import monkeypatch from pytest
def test_mytest(monkeypatch):
url = 'some_url'
def mockdlpage(url):
return 'the_mock_data'
monkeypatch.setattr(yourmodule, 'download_page_html', mockdlpage)
data = download_page_html(url)
無需通過混合'pytest'和'unittest'使事情變得複雜。如果您已經在使用'pytest',只需使用其內置的monkeypatch工具即可。 – Anthon
它並不複雜 - unittest.mock被推薦並用於pytest文檔。這只是愚蠢的「報復」。儘量客觀。 – jsbueno
假設用「pytest文檔」表示pytest文檔(如果不是其他內容?),我強烈建議您打開[pytest文檔頁面](https://docs.pytest.org/en/latest/contents.html)並搜索'unittest.mock'或'from unittest'或者下載[PDFdocumentation](https://media.readthedocs.org/pdf/pytest/latest/pytest.pdf)並搜索。我找到了使用'unittest.mock'的零結果。所以,請支持您的索賠與一些參考或解釋你認爲是什麼「pytest文件」 – Anthon