在Python中使用Stubbing vs Mocking

时间:2014-08-01 05:43:02

标签: python unit-testing mocking stub

我想模拟或存根一个函数进行测试。不确定我是否有正确的术语所以如果我错了就纠正我,但我理解一个模拟使用类似于unittest.mock的模拟库来创建一个假对象,并期望它将接收什么参数和什么它会返回什么等等。这对我来说似乎有点过分,因为我想要的是模拟/存根方法,它返回一个设定值。

我认为存根只是'没有图书馆的嘲笑',就像this question的回答一样。从我所看到的,这正是我想要的。它轻巧简单,你不必为简单的案例搞砸所有嘲弄的选择。

我的问题是,这样做是否安全?上面的问题似乎是覆盖了方法的内存表示,而且它似乎并不正确。这是python社区接受的吗?或者是否鼓励他们一直使用适当的模拟库?

编辑如果你没有在finally块中重新分配方法会发生什么样的可怕事情,因为链接的答案说明了?

1 个答案:

答案 0 :(得分:1)

我想自己存根这个方法的主要原因是我不必担心模拟并完成设置。但是我发现this blog post显示了使用带注释的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")