14

私はpython 3.3を使用callしており、subprocess.pyから使用するメソッドをテストする必要があります。

私は試した:

subprocess.call = MagicMock()

with patch('subprocess.call') as TU_call:

しかし、デバッグモードでは、Python呼び出しが効果的であることがわかりましたsubprocess.call

4

2 に答える 2

11

私にとっては問題なく動作します(Ubuntu 13.04、Python 3.3.1):

$ python3.3
Python 3.3.1 (default, Sep 25 2013, 19:29:01) 
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mock
>>> import subprocess
>>> result = subprocess.call('date')
Fri Jan  3 19:45:32 CET 2014
>>> subprocess.call = mock.create_autospec(subprocess.call, return_value='mocked!')
>>> result = subprocess.call('date')
>>> print(result)
mocked!
>>> subprocess.call.mock_calls
[call('date')]

この質問は、この特定 mockのパッケージの使用法に関するものだと思います

あなたの直接の質問とは関係のない一般的な声明

質問が特に python モック パッケージの使用に関するものであることを理解する前に、これを書きました。

関数をモックする一般的な方法の 1 つは、関数またはメソッドを明示的に再定義することです。

$ python3.3
Python 3.3.1 (default, Sep 25 2013, 19:29:01) 
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call('date')
Fri Jan  3 19:23:25 CET 2014
0
>>> def mocked_call(*a, **kw):
...   return 'mocked'
... 
>>> subprocess.call = mocked_call
>>> subprocess.call('date')
'mocked'

この単純なアプローチの大きな利点は、パッケージの依存関係がないことです。欠点は、特定のニーズがある場合、すべての意思決定ロジックを手動でコーディングする必要があることです。

パッケージのモックの例として、FlexMock はPython 2.7 と Python 3.* の両方で利用できsubprocess.call、そのオーバーライドの使用法についてはこの質問で説明しています。

于 2014-01-03T18:31:16.290 に答える