16

私はpython-mockを使用して、ファイルを開く呼び出しをモックしています。この方法で偽のデータを渡すことができるようにしたいので、read()テストでファイルシステムにヒットすることなく、テストデータを使用するだけでなく、それが呼び出されていることを確認できます。

ここに私がこれまでに持っているものがあります:

file_mock = MagicMock(spec=file)
file_mock.read.return_value = 'test'

with patch('__builtin__.open', create=True) as mock_open:
    mock_open.return_value = file_mock

    with open('x') as f:
        print f.read()

これの出力は、私が想定しているようなものではあり<mock.Mock object at 0x8f4aaec>ません。'test'このモックを作成する際に何が間違っていますか?

編集:

次のようになります。

with open('x') as f:
     f.read()

この:

f = open('x')
f.read()

異なるオブジェクトです。モックをコンテキスト マネージャーとして使用すると、 newMockが返されますが、それを直接呼び出すと、 で定義したものが返されmock_open.return_valueます。何か案は?

4

3 に答える 3

27

Python 3 では、パターンは次のようになります。

>>> import unittest.mock as um
>>> with um.patch('builtins.open', um.mock_open(read_data='test')):
...     with open('/dev/null') as f:
...         print(f.read())
...
test
>>>

(はい、 /dev/null をモックしてファイルの内容を返すこともできます。)

于 2016-04-08T00:05:23.423 に答える
12

これはStringIO、ファイル インターフェイスを既に実装しているオブジェクトの適切な使用例のように思えます。多分あなたは作ることができますfile_mock = MagicMock(spec=file, wraps=StringIO('test'))。または、関数にファイルのようなオブジェクトを受け入れさせてStringIO、実際のファイルの代わりに渡すこともできます。これにより、醜いモンキー パッチの必要がなくなります。

モックのドキュメントを見ましたか?

http://www.voidspace.org.uk/python/mock/compare.html#mocking-the-builtin-open-used-as-a-context-manager

于 2012-01-05T17:46:47.267 に答える