2017-06-23 5 views
0

download_page_html(url)は、有効なurlが指すページのHTMLコンテンツをダウンロードします。さまざまな機能を使用して彼らの仕事をdownload_page_htmlpytestを使用して関数呼び出しを傍受し、パラメータを変更する方法は?

私はWikipediaからHTMLをダウンロードするのではなく、ローカルホストから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'で物事を複雑にする必要はありません:変更CH、ビルトインmonkeypatchpytest年代を使用しています。すでに 'pytest'を使用している場合は、組み込みのmonkeypatch機能を使用してください。 – Anthon

+0

これは妥当ではありません - unittest.mockはpytest文書全体で使用され推奨されています。これはちょうど愚かな "復讐"です。客観的になるようにしてください。 – jsbueno

+0

"pytest documents"とは、pytestのドキュメントを意味すると思います(そうでない場合は?)、[pytest documentation page](https://docs.pytest.org/ja/latest/contents.html)を開くことをお勧めします。 'unittest.mock'または' unittest'を検索するか、[PDFdocumentation](https://media.readthedocs.org/pdf/pytest/latest/pytest.pdf)をダウンロードして検索してください。私は 'unittest.mock'を使うためにそのような結果を得られませんでした。したがって、いくつかの参考文献を使ってあなたの主張を支持してください。または、 "pytest documents"と考えられるものについて説明してください。 – 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) 

すると、あなたのデザインワラントsuとは思わない場合

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

関連する問題