【问题标题】:How to mock the default value of a method in python?如何模拟python中方法的默认值?
【发布时间】:2021-02-19 15:17:02
【问题描述】:

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

class FirstClass:

    def method_one():
        second_class = SecondClass()

第二个类有一个带有默认参数的方法:

class SecondClass:
    def method_two(important_date: datetime.date = get_today())

还有一个函数get_today在另一个文件date_service

def get_today() -> datetime.date:
    return datetime.date.today()

我正在test_first_class.py 中测试method_one,但我无法模拟get_today() 的值。

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

  • 我试过that,但在排队
with patch.object(build_url, 'func_defaults', ('domain',)):

我不知道我必须在build_url 上输入什么。我尝试了SecondClass.method_two 之类的方法,但它不起作用。

备注:我知道一个好的单元测试应该独立测试FirstClassSecondClass,并在test_first_class.py 中模拟method_two,但由于某些原因我不能这样做:-(

【问题讨论】:

  • 如果您的程序运行到午夜,它可能会产生不良结果。
  • 就我而言,这没什么大不了的,但我明白你的意思。哪个是解决方案?如果它持续到午夜,就没有办法避免潜在的不良后果,是吗?
  • 你试过理解文档吗? docs.python.org/3/library/unittest.mock.html#patch-object(不是联合专家)
  • 不要将第一天作为 am 参数默认值,而是使用 None 作为默认值并在方法中处理它以始终获取最近一天。
  • 哦@Klaus D.,你是对的!我没有考虑过默认参数只加载一次的事实!好的,我会改变它,然后我不需要那样模拟它。不过,我找到了一个解决方案,如果有人感兴趣,我会发布它。非常感谢您的评论!!!

标签: python pytest python-unittest


【解决方案1】:

我终于解决了以下问题:

@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_classfirst_class 分别包含SecondClassFirstClass;而 mock_today 是我今天用来模拟的日期。

注意:你需要重新加载两个类,并且按照这个顺序,否则,它不起作用。

备注:根据@Klaus D. 的评论,我终于不能使用get_today() 作为默认的可选参数,我也不必使用所有这些乱七八糟的东西,但如果有人需要,我会给出答案。 ..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多