python - 用补丁模拟两个函数以进行单元测试

标签 python unit-testing testing mocking nose

我有一个要单元测试的函数包含调用其他两个函数。我不确定如何使用补丁正确地同时模拟这两个函数。我在下面提供了一个例子来说明我的意思。当我运行nosetests时,测试通过了,但我觉得必须有一种更清洁的方法来做到这一点,我并不真正理解关于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:

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 对象):

from unittest.mock import patch

@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)。

关于python - 用补丁模拟两个函数以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15763394/

相关文章:

javascript - 如何编写一个期望在 Jasmine 中抛出 'Error' 的测试?

asp.net - 请求在 Jmeter Testing asp dot net 中显示响应数据 "Object moved to here"

python - 使用 HTTrack 镜像单个页面

python - 如何在 Keras 中实现高斯模糊层?

python - 在文件中查找大于 32KB 的零个 block

c# - 为什么 ReactiveTest 不遵守此测试中的滴答计数

python - 使用palantir代工厂中的存储库输出.docx文档

asp.net-mvc - ASP.NET MVC – Controller 测试的模拟成员

java - 如何测试使用 Basho 的 riak-java-client 的 java 代码?

c# - VS2010 中的单元测试