2015-01-30 5 views
2

Можно изменить имя тестового аргумента исправленного класса или функции при использовании патча в качестве декоратора.Python Mock patch.multiple names names

@patch('module.ClassName2') 
@patch('module.ClassName1') 
def test(MockClass1, MockClass2): 
    MockClass1.test.return_value = 'testing' 

Однако, я не могу найти в документации, как отличить оригинальный объект и издеваться при использовании patch.multiple.

@patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT) 
def test(foo, bar): 
    foo.return_value = 'foo' 

В приведенном выше примере, аргументы в тесте должны быть foo и bar. Есть ли какой-либо чистый способ разрешить их использование с более четкой дифференциацией, например. mock_foo?

Это также удобно в тех случаях, когда исходный класс или метод, необходимые в части теста, избегая импорт как from module import Class as OriginalClass

Спасибо заранее.

ответ

3

Нет и ... да:

  • Нет, потому что если вы посмотрите на mock source code вы увидите, что нет никакого способа изменить attribute_name
  • Да потому, что они передаются как ключевые слова арг и так они встроены в словарь слов args: поэтому вы можете извлечь их из словаря по своему усмотрению.

Следуйте за простым примером того, как вы можете это сделать ... Я знаю, что, возможно, это не совсем то, что вы ищете, но это единственный способ сделать это.

@patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT) 
def test(**mocks): 
    mock_foo, mock_bar = mocks["foo"], mocks["bar"] 
    mock_foo.return_value = 'foo' 
    mock_bar.return_value = 'bar' 

Если вы используете patch.multiple в качестве контекста менеджера, который является единственным способом, чтобы получить издевается, поэтому два способа соответствуют

def test(): 
    with patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT) as mocks: 
     mock_foo, mock_bar = mocks["foo"], mocks["bar"] 
     mock_foo.return_value = 'foo' 
     mock_bar.return_value = 'bar' 
+0

Я знал, что издевается были переданы в качестве словаря в контексте менеджер, но не думал применять такую ​​же логику к декоратору! Я думаю, вы правы, и это как можно ближе. Благодаря! –