2016-07-19 2 views
3

Я пытаюсь макете файл открытым, и все примеры показывают, что мне нужнофиктивный файл открыт в питона

@patch('open', create=True) 

, но я получаю

Need a valid target to patch. You supplied: 'open' 

Я знаю, что патч нуждается полная пунктирная линия open, но я понятия не имею, что это. На самом деле, я даже не уверен, что это проблема.

+1

1. Из что вы опубликовали, мы не можем сказать вам, каким должен быть путь, или если это проблема. Дайте [mcve]. 2. Вы знаете, что для этого существует ['mock_open'] (https://docs.python.org/3/library/unittest.mock.html#mock-open)? – jonrsharpe

ответ

9

Вам необходимо указать имя модуля; если вы тестируете в сценарии, имя модуля __main__:

@patch('__main__.open') 

иным образом использовать имя модуля, который содержит код, который вы проверяете:

@patch('module_under_test.open') 

так, что любой код, который использует встроенный open(), вместо этого найдет исправленный глобальный.

Обратите внимание, что mock модуль поставляется с mock_open() utility, который будет препятствовать вам построить подходящий open() вызов с данными файла:

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n')) 
+0

Вопрос: Может ли такой макет (с указанным значением return_value) использоваться в качестве менеджера контекста (внутри оператора 'with')? – 0xc0de

+0

@ 0xc0de: да, документ, к которому я ссылаюсь, включает в себя примеры 'open()', которые используются с '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. –

+0

Да, я видел это позже, спросив здесь. Благодарю. – 0xc0de

1

В Python 3 следует использовать:

@mock.patch("builtins.open", create=True) 
Смежные вопросы