48

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

我有以下课程要测试。

class MyClassUnderTest(object):

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

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

在我的测试中,我想确保在执行submethodmain_method调用了它并且使用正确的参数调用了它。我不想submethod跑,因为它会做危险的事情。

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

我怎样才能模拟该submethod功能,同时main_method单独保留该功能?

4

1 回答 1

59

我想你正在寻找的是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)

这是小说明

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

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

于 2013-11-01T23:47:30.030 回答