2016-11-28 1 views
1

У меня есть следующие файлы:Как издеваются класс, чтобы он не работает на импорт

test_temp.py:

import pytest 
from mock import patch 

with patch('temp.TheEvilClass'), patch('temp2.TheEvilClass'): 
    from temp import TempClass 


def test_evil(): 
    assert True 

temp.py:

from temp2 import TheEvilClass 

class TempClass(object): 
    TheEvilClass() 

temp2.py:

class TheEvilClass(object): 
    print "I'm evil! ]:>" 
    raise Exception 

My i ntention был для патча в test_temp.py, чтобы высмеять TheEvilClass, чтобы исключение никогда не вызывалось. Я попытался исправить его в обоих местах, но исключение все еще бросается. У вас есть какие-то указания на то, что я делаю неправильно, и как тестировать temp.py, не вызывая фактического TheEvilClass? Я попытался насмехаться над всем модулем (с patch('temp2')), но это тоже не работает.

+2

Вы не можете, вы исправляете * после * импорт. Вместо этого вы должны перепроектировать 'temp2', чтобы ничего не делать при импорте. – jonrsharpe

+1

Я не согласен с @jonrsharpe, вы можете не захотеть изменить способ работы кода только для целей теста. Скорее, это случай, когда нужно правильно настроить среду, чтобы импорт не прерывался. – wim

+0

К сожалению, я ничего не могу сделать о temp2, так как это внешний модуль. – iknownothing

ответ

1

То, что вы пытаетесь сделать, невозможно с mock, так как сам патч запускает импорт. patch звонки _get_target, который использует _importer, который вызывает __import__.

https://github.com/testing-cabal/mock/blob/master/mock/mock.py#L1206

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

patch('temp.TheEvilClass').__enter__() 

Правильный путь об этом является создание тестовой среды, так что необработанное исключение Арен» во время импорта.

+0

Как это прямое исправление патча? Я не совсем понимаю, чего я достиг, назвав __enter __() патча, после того, как он вызван в любом случае. И под «настройкой тестовой среды» вы подразумеваете просто подавление исключения? – iknownothing

+2

Я имею в виду, если вы вообще используете патч (либо путем прямого вызова '__enter__', либо с помощью оператора' with'), то вы все равно увидите исключение, потому что * это действие патча, которое импортирует код *. Если вы замените строку 'from temp import TempClass' в' test_temp.py' только с помощью 'pass', вы поймете, что я описываю. Вы делаете это неправильно, это проблема XY. Правильный подход заключается в настройке тестовой среды, которая достаточно хорошо имитирует среду выполнения, что этот код не выдает ошибку во время импорта. – wim