Python 如何用monkeypatch替换常量
我想在测试中模拟(覆盖)常量Python 如何用monkeypatch替换常量,python,pytest,monkeypatching,Python,Pytest,Monkeypatching,我想在测试中模拟(覆盖)常量 常数.py LIMIT=1000 我的班 从常量导入限制 类别MyClass: def get_限制(自身): 退货限额 测试/测试我的班级.py 从my_类导入MyClass 类TestMyClass: def测试\u获取\u限制\u应返回\u值(self,monkeypatch): monkeypatch.setattr('constants',LIMIT,10) c=MyClass() 断言c.get_limit()==10 这个结果如下 $
- 常数.py
LIMIT=1000
- 我的班
从常量导入限制
类别MyClass:
def get_限制(自身):
退货限额
- 测试/测试我的班级.py
从my_类导入MyClass
类TestMyClass:
def测试\u获取\u限制\u应返回\u值(self,monkeypatch):
monkeypatch.setattr('constants',LIMIT,10)
c=MyClass()
断言c.get_limit()==10
这个结果如下
$pytest
===========================================测试会话开始==============================
平台linux——Python 3.8.0、pytest-6.2.4、py-1.10.0、pluggy-0.13.1
rootdir:/home/sugimurase/src
收集1项
测试/测试我的班级.py F[100%]
======================================================故障===================================
________________TestMyClass.test\u获取\u限制\u应\u返回\u值________________
自我=
monkeypatch=
def测试\u获取\u限制\u应返回\u值(self,monkeypatch):
>monkeypatch.setattr('constants',LIMIT,100)
E名称错误:未定义名称“限制”
tests/test_my_class.py:6:NameError
==============================================短测试摘要信息============================
失败的测试/test\u my\u class.py::TestMyClass::test\u get\u limit\u should\u return\u值
===========================================1在0.08秒内失败===============================
我将“常量”替换为“my_class.constants”、“MyClass”,但得到了相同的错误。
我该怎么做呢?你需要在
我的班级上设置monkey patch限制。要执行此操作,请导入my_class
,并确保将字符串“LIMIT”
和名称my_class
传递给monkey patch(您可以在上面向后传递)。这对我来说很重要:
import my_class
class TestMyClass:
def test_get_limit_should_return_value(self, monkeypatch):
monkeypatch.setattr(my_class, 'LIMIT', 10)
c = my_class.MyClass()
assert c.get_limit() == 10
您需要在my_class
上对LIMIT
进行monkey-patch。要执行此操作,请导入my_class
,并确保将字符串“LIMIT”
和名称my_class
传递给monkey patch(您可以在上面向后传递)。这对我来说很重要:
import my_class
class TestMyClass:
def test_get_limit_should_return_value(self, monkeypatch):
monkeypatch.setattr(my_class, 'LIMIT', 10)
c = my_class.MyClass()
assert c.get_limit() == 10
如果您已经在测试中导入了MyClass
,这意味着您当时也执行了LIMIT
的导入,因此monkeypatching常量将不会有帮助。你应该monkeypatch方法get\u limit()
本身。我不完全理解常量在哪里是活动的。你的建议很有帮助。非常感谢。如果您已经在测试中导入了MyClass
,这意味着您也在那时执行了LIMIT
的导入,因此monkeypatching in constant不会有帮助。你应该monkeypatch方法get\u limit()
本身。我不完全理解常量在哪里是活动的。你的建议很有帮助。非常感谢你。