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()
本身。我不完全理解常量在哪里是活动的。你的建议很有帮助。非常感谢你。