我在嘲笑一个功能上遇到了一些麻烦。所述函数已导入并在run_parsers.py
中使用,我正在
ImportError: 'No module named run_parsers'
当我尝试mock.patch
run_parsers.py
时。
这是test_run_parsers.py
from .. import run_parsers # Used in all my other tests.
def test_node_data_parser_throws_exception(self):
def parser():
return NotImplementedError()
with mock.patch("run_parsers.get_node_paths") as node_paths:
node_paths.return_value = "node_1"
run_parsers.get_node_data(parser, "/a/path")
这是我的存储库结构
control_scripts
├── __init__.py
├── README.md
├── run_all_parsers.py
├── run_parsers.py
└── tests
├── __init__.py
├── test_run_parsers.py
According to this tutorial I'm supposed to mock where the function is imported.这就是为什么我试图模拟调用模块而不是模块定义get_node_paths
答案 0 :(得分:3)
我不确定这是否与您的设置完全重复,但这是一个对我有用的简单测试用例。
目录设置为:
type="xs:base64binary"
在scripts.py:
模块中c:\work
\control
__init__.py
scripts.py
\tests
__inti__.py
mytests.py
and c:\work is on sys.path
在mytests.py中:
def identity(x):
return x
def do_identity(x):
return identity(x)
所以我在这里要做的就是模仿功能'身份'这是由函数“do_identity”调用的。这两个功能都在'脚本中。模块。此测试运行时没有错误或失败。
我可以从任何目录运行:
import unittest
from unittest.mock import patch
from control import scripts
class MyTest(unittest.TestCase):
def test_patch(self):
with patch('control.scripts.identity') as mymock:
mymock.return_value = 99
self.assertEqual(scripts.do_identity(1), 99)
def test_no_patch(self):
self.assertEqual(scripts.do_identity(1), 1)
if __name__ == "__main__":
unittest.main()
答案 1 :(得分:1)
对于更复杂的项目结构(或者如果您想使模拟部分更短),我想出了一个棘手的解决方案,因为我需要在逻辑和UI之间进行分隔。
我的结构看起来像这样:
├───sourceroot
│ ├───python_pkg
│ │ ├───__init__
│ │ └───subpkg
│ │ ├───__init__
│ │ ├───logic
│ │ │ ├───lpkg1
│ │ │ │ ├───__init__
│ │ │ │ ├───file1.py
│ │ │ │ └───file2.py
│ │ │ ├───lpkg2
│ │ │ │ ├───__init__
│ │ │ │ ├───file3.py
│ │ │ │ └───file4.py
│ │ │ ├───__init__
│ │ │ └───file.py
│ │ └───ui
│ │ ├───uipkg3
│ │ │ ├───__init__
│ │ │ ├───file_ui1.py
│ │ │ └───file_ui2.py
│ │ ├───uipkg4
│ │ │ ├───__init__
│ │ │ ├───file_ui3.py
│ │ │ └───file_ui4.py
│ │ ├───__init__
│ │ └───file_ui.py
│ └───packages
│ └───some_3rd_party_packages
├───srcfiles_from_3rd_parties
└───tests
└───unit_tests_py
├───__init__
└───test.py
我必须引用test.py中的file.py和file1.py。
要查看test.py文件中的sourceroot,我将以下内容写入sourceroot/tests/unit_test_py/__init__
import sys
import os
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')))
初始化后,将sourceroot添加到路径(Python将在其中查找)test.py
类已准备好进行编辑:
之前:
import mock
from sourceroot.python_pkg.subpkg.logic import file
from sourceroot.python_pkg.subpkg.logic.lpkg1.file1 import SomeClassFromFile1 as SCF1
class Test_test1(object):
def test_first(self, mocker):
mocker.patch('sourceroot.python_pkg.subpkg.logic.lpkg1.file1.some_function_which_SCF1_calls')
mocker.patch('sourceroot.python_pkg.subpkg.logic.file.SomeClassInFile.some_function_which_SomeClassInFile_calls')
SCF1.some_function_in_SCF1()
expected_information = True
assert SCF1.is_something() == expected_information
之后:
import mock
from sourceroot.python_pkg.subpkg.logic import file
from sourceroot.python_pkg.subpkg.logic.lpkg1.file1 import SomeClassFromFile1 as SCF1
class Test_test1(object):
def test_first(self, mocker):
mocker.patch.object(SCF1, 'some_function_which_SCF1_calls')
mocker.patch.object(file.SomeClassInFile, 'some_function_which_SomeClassInFile_calls')
SCF1.some_function_in_SCF1()
expected_information = True
assert SCF1.is_something() == expected_information