Python 3.x 在Python3中模拟时正确访问导入的名称空间
我正在用Python3启动一个新项目。我打算将此作为一个PIP包,因此我从一个cookiecutter模板开始,如下所示:Python 3.x 在Python3中模拟时正确访问导入的名称空间,python-3.x,unit-testing,Python 3.x,Unit Testing,我正在用Python3启动一个新项目。我打算将此作为一个PIP包,因此我从一个cookiecutter模板开始,如下所示: cycle_calendar_generator /cycle_calendar_generator __init__.py cycle_calendar_generator.py /tests __init__.py test_cycle_calendar_generator.py 这个项目将在我的学校广泛使用,所以我想从一开始就做坚实的单元测试。我宁愿
cycle_calendar_generator
/cycle_calendar_generator
__init__.py
cycle_calendar_generator.py
/tests
__init__.py
test_cycle_calendar_generator.py
这个项目将在我的学校广泛使用,所以我想从一开始就做坚实的单元测试。我宁愿坚持使用包含Python 3的单元测试模块,因为它们很简单,可以做我想做的事情
问题是我需要模拟核心API模块,比如argparse和os。我看到一些建议,您应该模拟导入的核心API模块的名称空间,而不是模块本身。(因此模拟周期_calendar_generator.argparse是正确的,但导入argparse并模拟它是错误的,因为它是argparse的不同副本。)
话虽如此,以下是我在test_cycle_calendar_generator.py中的内容:
import unittest
from unittest import mock
from cycle_calendar_generator import cycle_calendar_generator
class Test_get_args(unittest.TestCase):
"""Tests for `cycle_calendar_generator` package."""
def setUp(self):
"""Set up test fixtures, if any."""
def tearDown(self):
"""Tear down test fixtures, if any."""
@mock.patch('cycle_calendar_generator.argparse.parse_args')
def test_if_arg_is_string(self, mock_parse_args):
mock_parse_args.return_value = cycle_calendar_generator.argparse.Namespace(directory='string')
self.assertIsInstance(cycle_calendar_generator.getArgs(), str)
这给了我一个错误AttributeError:模块'cycle\u calendar\u generator'没有属性'argparse'
,因此它显然找不到导入的argparse,但我不知道如何解决它。知道会发生什么吗?谢谢
AttributeError:模块“周期日历生成器”没有属性“argparse”
应该是:
@mock.patch('cycle_calendar_generator.cycle_calendar_generator.argparse.ArgumentParser.parse_args')
不是
不是
现在这给了我一个错误:
AttributeError:没有属性'parse_args'
@ROldford,我们通常不模拟或测试argparse
,我更新了模拟,以防你仍然想这样做。我今天早些时候确实得到了,但谢谢!多亏了你的帮助,终于取得了进步。
@mock.patch('cycle_calendar_generator.cycle_calendar_generator.argparse.parse_args')
@mock.patch('cycle_calendar_generator.argparse.parse_args')