4

Python でモックを使用すると、トップ レベルのパッケージ (argparse など) に完全にパッチを適用することはできません。おそらく、パッチへの参照がないためです。1 つの解決策は、個々の呼び出しをすべてパッケージにパッチすることです (argparse.ArgumentParser など)。理論的には、パッケージへの呼び出しが対応するパッチなしで追加された場合、単体テスト中に誤ってインポートが呼び出されることになります。

回避策はそれほど不便ではありませんが、argparse などのパッケージに完全にパッチを適用するのが理想的です。mock_openopen()は、 を使用して組み込みにパッチを当てるために、いくつかの悪ふざけを採用しているよう__main__.openです。それはどのように機能し、トップレベルのパッケージにパッチを当てるために同様の悪ふざけを使用できますか?

4

1 に答える 1

4
import unittest.mock as mock

mock_argparse = mock.Mock()
with mock.patch.dict('sys.modules', argparse=mock_argparse):
    import argparse
    print(argparse.ArgumentParser()) 
# <Mock name='mock.ArgumentParser()' id='140681471282448'>

mock_open パッチ適用に関して:

m = mock_open()
with patch('__main__.open', m, create=True):

モジュールで関数__main__.openを定義したかのように、組み込みバージョンをシャドウするモックオブジェクトで属性を作成するようです。open()実際のテストではmodule_x.open()、「module_x」が実際に呼び出すモジュールであるパッチを適用する必要があると思いますopen()

于 2014-04-03T13:04:02.360 に答える