仅模拟对象上的单个方法

2022-01-08 00:00:00 python mocking python-mock

问题描述

我熟悉其他语言中的其他模拟库,例如 Java 中的 Mockito,但 Python 的 mock 库让我感到困惑.

我想测试以下课程.

类 MyClassUnderTest(object):def 子方法(自我,*args):do_dangerous_things()def main_method(self):self.submethod("什么都没有.")

在我的测试中,我想确保在执行 main_method 时调用了 submethod 并且使用正确的参数调用它.我不希望 submethod 运行,因为它会做危险的事情.

我完全不确定如何开始使用它.Mock 的文档非常难以理解,我不确定要模拟什么或如何模拟它.

我怎样才能模拟 submethod 函数,同时保留 main_method 中的功能?

解决方案

我想你要找的是 mock.patch.object

用 mock.patch.object(MyClassUnderTest, "submethod") 作为 submethod_mocked:submethod_mocked.return_value = 13MyClassUnderTest().main_method()submethod_mocked.assert_call_once_with(user_id, 100, self.context,self.account_type)

这里是小描述

 patch.object(目标, 属性, new=DEFAULT,规格=无,创建=假,规格集=无,autospec=None, new_callable=None, **kwargs)

<块引用>

使用模拟对象修补对象(目标)上的命名成员(属性).

I'm familiar with other mocking libraries in other languages such as Mockito in Java, but Python's mock library confuses the life out of me.

I have the following class which I would like to test.

class MyClassUnderTest(object):

    def submethod(self, *args):
       do_dangerous_things()

    def main_method(self):
       self.submethod("Nothing.")

In my tests, I'd like to make sure that the submethod was called when main_method was executed and that it was called with the right arguments. I don't want submethod to run, as it does dangerous things.

I'm entirely unsure as to how to get started with this. Mock's documentation is incredibly hard to understand and I'm not sure what to even mock or how to mock it.

How can I mock the submethod function, while leaving the functionality in main_method alone?

解决方案

I think what you are looking for is mock.patch.object

with mock.patch.object(MyClassUnderTest, "submethod") as submethod_mocked:
    submethod_mocked.return_value = 13
    MyClassUnderTest().main_method()
    submethod_mocked.assert_called_once_with(user_id, 100, self.context,
                                             self.account_type)

Here is small description

 patch.object(target, attribute, new=DEFAULT, 
              spec=None, create=False, spec_set=None, 
              autospec=None, new_callable=None, **kwargs)

patch the named member (attribute) on an object (target) with a mock object.

相关文章