[英]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.