繁体   English   中英

在Python中进行存根与模拟

[英]Stubbing vs Mocking in Python

我想模拟或存根函数进行测试。 不知道我的术语是否正确,如果我错了,请更正我,但是我将模拟理解为使用类似于unittest.mock的模拟库来创建伪造的对象,并且对它将接收的参数以及预期的参数有期望将会返回,等等。这对我来说似乎有点矫kill过正,因为我想要做的只是模拟/存根方法要做的就是返回一个设定值。

我认为存根就像是“没有图书馆的嘲笑”,就像这个问题的答案一样。 从我所看到的,这正是我想要的。 它既轻巧又简单,您不必为简单的案例而嘲笑所有的选项。

我的问题是, 这样做安全吗? 上面的问题似乎是在覆盖方法的内存表示形式,但这似乎并不正确。 python社区接受了吗? 还是鼓励人们始终使用适当的模拟库?

编辑如果未按照链接的答案说明在final块中重新分配方法,将会发生什么可怕的事情?

我想自己添加方法的主要原因是,这样我就不必担心模拟并进行设置。 但是,我发现此博客文章显示了一种使用带有注释的mock库的绝妙方法,这比手动创建Mock实例要容易得多。 这是节选:

rm.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import os.path

def rm(filename):
    if os.path.isfile(filename):
        os.remove(filename)

rmtest.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from mymodule import rm

import mock
import unittest

class RmTestCase(unittest.TestCase):

    @mock.patch('mymodule.os.path')
    @mock.patch('mymodule.os')
    def test_rm(self, mock_os, mock_path):
        # set up the mock
        mock_path.isfile.return_value = False

        rm("any path")

        # test that the remove call was NOT called.
        self.assertFalse(mock_os.remove.called, "Failed to not remove the file if not present.")

        # make the file 'exist'
        mock_path.isfile.return_value = True

        rm("any path")

        mock_os.remove.assert_called_with("any path")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM