2016-02-22 4 views
0

Я новичок в python насмешливо. Я знаю, что мы можем использовать mock.patch для фальсификации f1 для тестирования f2. Например:Почему не удается напрямую обмануть объект в unittest?

def f1(x): 
    return x 

def f2(x): 
    return f1(x) + 5 

class ExampleTest(unittest.TestCase): 

    @mock.patch('__main__.f1') 
    def test_f2(self, mock_f1): 
     mock_f1.return_value = 0 
     self.assertEqual(f2(5), 5) 

Но я обнаружил, что если я непосредственно издевался над f1 в тестовом примере, как показано ниже, он не работает. Я понятия не имею, почему просто не может просто издеваться над «f1» здесь?

class ExampleTest(unittest.TestCase): 

    def test_f2(self): 
     f1 = mock.Mock() 
     f1.return_value = 0 
     self.assertEqual(f2(5), 5) 

ответ

1

Даже patch и Mock находятся в том же пакете, они имеют разные обязанности:

  1. По mock.Mock() вы создаете фиктивный объект f1 (локальные переменный)
  2. К patch('__main__.f1') вы зашивкам f1 ссылки в __main__ (тот, который вы используете)

patch поведение по умолчанию для нас e mocks, чтобы заменить исходную ссылку, но вы можете использовать ее также для установки заглушек или подделок: основная функция - для управления контекстом, в котором вы заменяете ссылку.

Только один совет: взгляните на where to patch ... он может вас осветить.

+0

Спасибо за ваше объяснение! –

3

Не знаете, почему вы думаете, что сработает. Все, что вы делаете, это определение новой локальной переменной, называемой f1, которая является экземпляром Mock; так же, как если бы вы определили f1 = "foo", он вообще не влияет на имя уровня модуля.

+0

Hi, Daniel. Я использовал mock для f1 в интерпретаторе, это действительно влияет на f2. Поэтому я, хотя он также работает для unittest ... Означает ли это, что они находятся в разных пространствах имен? –

+0

Нет, они находятся в разных областях. Это не имеет никакого отношения ни к Mock, ни к unittest. Если вы определяете что-то внутри функции, это ничего не влияет на это имя за пределами функции (если вы не используете глобальный язык, которого вы не должны). –

+0

Спасибо. Я действительно использую «глобальный» –

Смежные вопросы