Reputation: 862
I'm trying to mock file open, and all of the examples show that I need to
@patch('open', create=True)
but I keep getting
Need a valid target to patch. You supplied: 'open'
I know patch needs the full dotted path of open
, but I have no idea what it is. As a matter of fact, I'm not even sure that's the problem.
Upvotes: 27
Views: 34433
Reputation: 1225
In Python 3 you should use the decorator
@mock.patch("builtins.open", create=True)
or as context manager
with mock.patch('builtins.open', mock.mock_open(read_data=some_data)) as m:
...
Upvotes: 34
Reputation: 1125028
You need to include a module name; if you are testing in a script, the name of the module is __main__
:
@patch('__main__.open')
otherwise use the name of the module that contains the code you are testing:
@patch('module_under_test.open')
so that any code that uses the open()
built-in will find the patched global instead.
Note that the mock
module comes with a mock_open()
utility that'll let you build a suitable open()
call with file data:
@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n'))
Upvotes: 33