Python中的stubing与mock
我想模拟或存根一个函数进行测试。我不确定我的术语是否正确,如果我错了,请纠正我,但我理解模拟是使用类似于的模拟库来创建假对象,并且对它将接收什么参数和返回什么有期望,这对我来说似乎有点过分了,因为我只想让mock/stubbed方法返回一个设置值 我认为存根只是“没有图书馆的嘲弄”,就像你的答案一样。从我看来,这正是我想要的。它轻巧而简单,你不必为了简单的案例而胡乱处理所有的模拟选项 我的问题是,这样做安全吗?上面的问题似乎覆盖了一个方法的内存表示,它似乎不正确。python社区是否接受这一点?还是一直鼓励使用适当的模拟库Python中的stubing与mock,python,unit-testing,mocking,stub,Python,Unit Testing,Mocking,Stub,我想模拟或存根一个函数进行测试。我不确定我的术语是否正确,如果我错了,请纠正我,但我理解模拟是使用类似于的模拟库来创建假对象,并且对它将接收什么参数和返回什么有期望,这对我来说似乎有点过分了,因为我只想让mock/stubbed方法返回一个设置值 我认为存根只是“没有图书馆的嘲弄”,就像你的答案一样。从我看来,这正是我想要的。它轻巧而简单,你不必为了简单的案例而胡乱处理所有的模拟选项 我的问题是,这样做安全吗?上面的问题似乎覆盖了一个方法的内存表示,它似乎不正确。python社区是否接受这一点?
编辑如果您没有在finally块中重新分配方法(如链接的答案所述),会发生什么可怕的事情?我想自己将该方法存根的主要原因是,这样我就不必担心一个模拟并进行设置。然而,我发现这是一种使用
mock
库和注释的极好方法,这比手动创建mock
的实例容易得多。以下是摘录:
rm.py
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")
要检查您的测试是否安全,请编写另一个测试来测试您的模拟。没有什么比元测试更好的了!实际上,您所描述的(返回设置值的对象)正是内置模拟库所做的,正如您从链接到的文档页面所看到的。模拟和存根之间的主要公认区别在于存根返回测试需要通过的数据,并且决不会导致测试失败。模拟用于验证对不同组件之间交互的期望。模拟和存根都可以在没有库的情况下完成。
#!/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")