如何在python中模拟方法的默认值?

如何在python中模拟方法的默认值?,python,pytest,python-unittest,Python,Pytest,Python Unittest,我有一个类,其方法实例化了第二个类的元素: class FirstClass: def method_one(): second_class = SecondClass() 第二个类有一个带有默认参数的方法: class SecondClass: def method_two(important_date: datetime.date = get_today()) 还有一个函数get\u today位于不同的文件date\u服务中: def get_toda

我有一个类,其方法实例化了第二个类的元素:

class FirstClass:

    def method_one():
        second_class = SecondClass()
第二个类有一个带有默认参数的方法:

class SecondClass:
    def method_two(important_date: datetime.date = get_today())
还有一个函数
get\u today
位于不同的文件
date\u服务中

def get_today() -> datetime.date:
    return datetime.date.today()
我正在一个
test\u first\u class.py中测试
method\u one
,我没有设法模仿
get\u today()的值

我在SO中查看了几页和解决方案,但无法修复。其中一些想法:

  • 我试过了,但不行
我不知道我必须在
build\u url
上写些什么。我尝试了类似于
SecondClass.method\u two
的方法,但不起作用


备注:我知道一个好的单元测试应该独立地测试
first class
SecondClass
,并在
test\u first\u class.py
中模拟
method\u two
,但由于某些原因我不能这样做:-(

我最终解决了以下问题:

@staticmethod
@patch('date_service.get_today', Mock(return_value=mock_today))
def test_something():
    importlib.reload(second_class)
    importlib.reload(first_class)
    first_class_element = FirstClass()
    whatever = first_class_element.method_one()
    assert (...)
其中,
second_class
first_class
分别包含
SecondClass
first class
;今天模拟是我今天模拟的日期

注意:您需要重新加载这两个类,并且按照这个顺序重新加载,否则它将无法工作


备注:根据@klausd.comment,我最终无法使用
get_today()
作为一个默认的可选参数,我不必使用所有这些乱七八糟的参数,但我会给出答案,以防有人需要它…

如果你的程序运行到午夜,可能会产生不希望的结果。在我的情况下,这没什么大不了的,但我理解你的意思。哪种解决方案?如果它运行到午夜,没有办法避免潜在的不良结果,是吗?你试过理解文档吗?(不是单元测试专家)不要将第一天作为am参数默认值,使用
None
作为默认值,并在方法中处理它以始终获取最近的一天。哦@Klaus D,你是对的!我没有考虑默认参数只加载一次的事实!好的,我会更改它,然后我不需要以那种方式模拟它。不过,我找到了一个解决方案,我会如果有人感兴趣,请发布。非常感谢您的评论!!!
@staticmethod
@patch('date_service.get_today', Mock(return_value=mock_today))
def test_something():
    importlib.reload(second_class)
    importlib.reload(first_class)
    first_class_element = FirstClass()
    whatever = first_class_element.method_one()
    assert (...)