Python - unittest, макет, патч, ввод - PullRequest
0 голосов
/ 06 ноября 2018

так что у меня проблема с моим кодом. Файл 1:

class Abc(object):
...
def function1(self):
 #do something
def function2(self):
 x = input()
 return x+1

и сейчас я пытаюсь проверить функцию 2, поэтому я написал для нее тест, и я не знаю, что я делаю неправильно:

from unittest.mock import patch
import unittest
from file1 import *

class TestBackend(unittest.TestCase):

    def test_mode_first(self):
        self.assertEqual(Abc().funcion1(), 30)

    @patch('funcion2.input', create=True)
    def test_mode_second(self, mocked_input):
        mocked_input.side_effect = ["QWE"]
        result = Abc().funcion2()
        self.assertEqual(result, 10)

if __name__ == '__main__':
    unittest.main()

я получаю ModuleNotFoundError: нет модуля с именем 'function2' так что я тут не так делаю?

спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 06 ноября 2018

Вы получаете ModuleNotFoundError, потому что funcion2 не является модулем. patch doc ясно об этом:

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

Это работает для меня, когда выполняется с помощью python3 -m unittest discover из каталога, в котором находятся файлы.

Кстати, у вас есть несколько опечаток в вашем примере, например, Abc().funcion2(), обратите внимание на отсутствующие t в funcion2.

Также старайтесь не использовать from … import *: https://docs.quantifiedcode.com/python-anti-patterns/maintainability/from_module_import_all_used.html#using-wildcard-imports-from-import

# file1.py
class Abc(object):
    def function1(self):
        return 30

    def function2(self):
        x = input()
        return x + "1"


# test_file1.py
import unittest
from unittest.mock import patch
from file1 import Abc


class TestBackend(unittest.TestCase):
    def test_mode_first(self):
        self.assertEqual(Abc().function1(), 30)

    @patch('builtins.input')
    def test_mode_second(self, mocked_input):
        mocked_input.return_value = "QWE"

        result = Abc().function2()
        self.assertEqual(result, "QWE1")
...