【问题标题】:How do I assert that a mocked class method was called with pytest?如何断言使用 pytest 调用了模拟类方法?
【发布时间】:2019-11-22 20:07:35
【问题描述】:
# blah app
class MyClass():
    def some_method():
        pass

# some_app app
from blah.service import MyClass
def some_app_function()
    my_class = MyClass()
    my_class.some_method()


@pytest.mark.django_db
def test_class_method_called(mocker):
    my_class = mocker.patch('some_app.MyClass')
    service.some_app_function()
    assert my_class.some_method.called # Getting False

我对函数做了完全相同的事情,它可以工作,但called 不是True,当它是类中的方法时。我错过了什么?

【问题讨论】:

  • 只需调用方法,这里不需要assert重写。否则,您就是在断言该方法的评估结果是真实的,它总是如此。
  • 我想确保在调用 some_app_function 时调用了 my_class.some_function。我显然在这里举了一个简单的例子,但我的实际要求是我为此断言。
  • 这实际上不是 Python 语法,因此很难准确判断您的问题是什么。但是the docs 向您展示了如何调用各种模拟断言方法。
  • 我错误地初始化了对象,我猜这可能是不直观的?还有别的吗?
  • 我必须做 my_class().some_method.call 参考:stackoverflow.com/a/47606924/1078232

标签: python mocking pytest


【解决方案1】:

您要修补的名称与some_app_function 来自同一模块;您正在修补错误的名称。

@pytest.mark.django_db
def test_class_method(mocker):
    my_class = mocker.patch('service.MyClass')
    sevice.some_app_function()
    assert my_class.some_function.called

【讨论】:

  • agh...我正在这样做,但它仍然无法正常工作。我会解决这个问题。如果我打印my_class.some_function,我确实看到了我有一个 MagicMock 对象
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多