2017-06-23 103 views
0

假設有一個功能download_page_html(url),它下載由(有效)url指向的頁面的HTML內容。各種功能使用它download_page_html做他們的工作。如何攔截函數調用並用pytest更改參數?

現在,測試時我不想從維基百科下載HTML,而是從本地主機下載。

那麼如何攔截各種函數調用download_page_html並替換url參數的值呢?

回答

-1

使用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(...): 
    ... 
+0

無需通過混合'pytest'和'unittest'使事情變得複雜。如果您已經在使用'pytest',只需使用其內置的monkeypatch工具即可。 – Anthon

+0

它並不複雜 - unittest.mock被推薦並用於pytest文檔。這只是愚蠢的「報復」。儘量客觀。 – jsbueno

+0

假設用「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

-1

您應該添加一個可選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的改變,使用內置monkeypatchpytest的:

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) 
+1

除非改變功能是系統的必要功能,否則這是一個非常糟糕的做法。你不應該爲了能夠測試它而使代碼複雜化。 – jsbueno

+0

使用硬編碼頂級功能的靈活性在我的經驗中是您設計的必要基礎。 – Anthon