我在尝试为项目执行 pytest UT 时遇到错误。
E TypeError: 'module' object is not callable
我有以下存储库结构:
├───src
│ └───company
│ ├───acc
│ └───dp
│ └───logic
│ ├───business
│ │ ├───__init__.py
│ │ ├───filter_customer.py
│ │ └───review_customers.py
│ └───general
│ └───__init__.py (and some functions)
├───tests
│ └───company
│ └───dp
│ └───logic
│ └───business
├───conftest.py
└───pyproject.toml
业务包下的每个文件都包含一个与该文件同名的函数。
让我们想象一下文件
filter_customer.py
:
def filter_customer(i: int)
return something
让我们想象一下文件
review_customers.py
(在 c =... 行中,运行此函数的 UT 时会引发错误):
from src.company.dp.logic.business import filter_customer
def review_customers()
c = filter_customer(10)
return something
UT 看起来像这样:
from src.company.dp.logic.business import review_customers
def test_review_customers()
#something before
t = review_customers()
#assert
__init__.py
业务包文件如下所示:
from src.company.dp.logic.business.filter_customer import filter_customer
from src.company.dp.logic.business.review_customers import review_customers
pyproject.toml
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]
where = ["src"]
[tool.pytest.ini_options]
addopts = [
]
testpaths = ["tests/company/dp/logic/business"]
python_files = "test_*.py"
python_functions = "test_*"
pythonpath = "src"
norecursedirs = "*"
在这种情况下如何正确组织包/模块?
目标是每个文件和包(例如 Business 和 General)拥有一个函数,以涵盖从模块的导入。
我尝试过多个版本。
当我使用从模块/文件直接导入时,它可以工作。当我像一般一样从不同的包调用函数时它也有效。
# This works:
from src.company.dp.logic.business.filter_customer import filter_customer
# With this I have error, even though IDE resolve it correctly:
from src.company.dp.logic.business import filter_customer
# This works:
from src.company.dp.logic.general import some_function
def review_customers()
c = filter_customer(10)
return something
filter_customer
是一个模块,还包含一个名为 filter_customer
的函数。您正在呼叫 filter_customer
,而不是 filter_customer.filter_customer
。
(这对我来说意味着您正在为每个函数定义一个单独的模块;不要这样做。)