Python 3 unittest patch не возвращает желаемого значения - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь использовать unitttest mock framework (python 3.4.9) , чтобы смоделировать один из методов в моем тестовом примере. И это терпит неудачу, поскольку это не возвращает поддельное значение.

Это самый простой пример. В моем случае я не могу изменить способ вызова метода.

метод макета

def patch_this_method():
    return 100

Контрольный пример

import unittest
from unittest.mock import patch
from libs.util import patch_this_method
import libs

class TestLibs(unittest.TestCase):
    @patch('libs.util.patch_this_method', return_value="200")
    def test_1(self, *mock):
        # return 200
        print(libs.util.patch_this_method())

        # this returns 100, original value
        print(patch_this_method())

1 Ответ

0 голосов
/ 22 января 2019

Эта строка

from libs.util import patch_this_method

импортирует объект, который является копией исходной функции, и функция еще не была исправлена.

Тогда перед параметром mock стоит странный символ *; на самом деле это не влияет на код, потому что он не используется, и тогда вы получите ожидаемые результаты. Первый вызов ссылается на исправленную функцию. Другой нет.

Edit: Что касается вашего вопроса в комментарии, вы не можете не использовать патч-декоратор, использование простого имени, не содержащегося в каком-либо пакете, не подойдет. Из документации патча-декоратора (цель - строка патча):

target должен быть строкой в ​​форме 'package.module.ClassName'. Цель импортируется, а указанный объект заменяется новым, поэтому цель должна импортироваться из среды, из которой вы вызываете patch (). Цель импортируется при выполнении декорированной функции, а не во время декорации.

Но вы можете просто написать:

from unittest.mock import Mock # or MagickMock if you need it
...
patch_this_method = Mock(return_value=200) 

А теперь ваши функции будут использовать фиктивную функцию.

...