TzurEl
TzurEl

Reputation: 862

mock file open in python

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

Answers (2)

wierzbiks
wierzbiks

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

Martijn Pieters
Martijn Pieters

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

Related Questions