我想模拟或存根一个函数进行测试。不确定我是否有正确的术语所以如果我错了就纠正我,但我理解一个模拟使用类似于unittest.mock的模拟库来创建一个假对象,并期望它将接收什么参数和什么它会返回什么等等。这对我来说似乎有点过分,因为我想要的是模拟/存根方法,它返回一个设定值。
我认为存根只是'没有图书馆的嘲笑',就像this question的回答一样。从我所看到的,这正是我想要的。它轻巧简单,你不必为简单的案例搞砸所有嘲弄的选择。
我的问题是,这样做是否安全?上面的问题似乎是覆盖了方法的内存表示,而且它似乎并不正确。这是python社区接受的吗?或者是否鼓励他们一直使用适当的模拟库?
编辑如果你没有在finally块中重新分配方法会发生什么样的可怕事情,因为链接的答案说明了?
答案 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")