我有一个要进行单元测试的函数,其中包含对另外两个函数的调用.我不确定如何正确使用补丁同时模拟这两个函数.我在下面提供了一个例子来说明我的意思.当我运行鼻子测试时,测试通过了,但我觉得必须有一种更简洁的方法来做到这一点,而且我并不真正理解关于 f.close() 的部分...
I have a function I want to unit test contains calls two other functions. I am unsure how can I mock both functions at the same time properly using patch. I have provided an example of what I mean below. When I run nosetests, the tests pass but I feel that there must be a cleaner way to do this and I do not really Understand the piece regarding f.close()...
目录结构如下:
program/ program/ data.py tests/ data_test.py数据.py:
import cPickle def write_out(file_path, data): f = open(file_path, 'wb') cPickle.dump(data, f) f.close()data_test.py:
data_test.py:
from mock import MagicMock, patch def test_write_out(): path = '~/collection' mock_open = MagicMock() mock_pickle = MagicMock() f_mock = MagicMock() with patch('__builtin__.open', mock_open): f = mock_open.return_value f.method.return_value = path with patch('cPickle.dump', mock_pickle): write_out(path, 'data') mock_open.assert_called_once_with('~/collection', 'wb') f.close.assert_any_call() mock_pickle.assert_called_once_with('data', f)结果:
$ nosetests . ---------------------------------------------------------------------- Ran 1 test in 0.008s OK 推荐答案您可以通过使用补丁装饰器并像这样嵌套它们来简化测试(默认情况下它们是 MagicMock 对象):
You can simplify your test by using the patch decorator and nesting them like so (they are MagicMock objects by default):
@patch('cPickle.dump') @patch('__builtin__.open') def test_write_out(mock_open, mock_pickle): path = '~/collection' f = mock_open.return_value f.method.return_value = path write_out(path, 'data') mock_open.assert_called_once_with('~/collection', 'wb') mock_pickle.assert_called_once_with('data', f) f.close.assert_any_call()对 MagicMock 实例的调用会返回一个新的 MagicMock 实例,因此您可以检查返回的值是否像任何其他模拟对象一样被调用.在这种情况下,f 是一个名为 'open()' 的 MagicMock(尝试打印 f).
Calls to a MagicMock instance return a new MagicMock instance, so you can check that the returned value was called just like any other mocked object. In this case f is a MagicMock named 'open()' (try printing f).
更多推荐
用补丁模拟两个函数进行单元测试
发布评论