涉及数据库的单元测试

时间:2017-03-29 02:11:35

标签: python unit-testing

假设我有一个目录

  home/user/my_python_scripts/
                   /src
                       /my_script.py
                   /tests
                      /test_my_script.py

我正在运行一些单元测试来测试my_script.py目录中的~/my_python_scripts/test。我正在将函数从my_script导入我的test_my_script.py

然而问题出现了,因为my_script.py中的函数从另一个脚本导入了另外两个函数。这两个函数在数据库中查询特定数据。我在我的测试脚本中模拟和修补这两个函数,但是当我在这个脚本上运行pytest时,函数最终会查询数据库。我查看了my_script.py使用的两个函数。他们每个人都查询不同的数据库,而且其中一个函数最终使用与其相同的三个其他函数。

我在单元测试中没有正确考虑这些功能和/或数据库吗?我无法共享代码,因为它是专有的,但我非常乐意在下面分享我的单元测试代码:

from pytest_mock import mocker

params = [(3141, 55)]
raw_data = [{'a': 'fizz', 'b': 'buzz', 'c': 'foo', 'd': 'hello'}]
descriptors = ['taxi', 3141, 55, 1]

def test_get_data(mocker):
    setattr(get_data, 'get_raw_data', params)
    mocker.patch.object(get_data, 'get_raw_data')
    get_data.get_raw_data.return_value = params
    setattr(get_data, 'get_data_by_day', raw_data)
    mocker.patch.object(get_data, 'get_data_by_day')
    get_data.get_data_by_day.return_value = raw_data
    assert get_data('taxi', 3141, '1', '3') == raw_data, descriptors

寻找任何建议和提示。

1 个答案:

答案 0 :(得分:1)

所以我明白了。我没有在修补的模拟函数上正确设置值。这是最终正常工作的代码。

from mock import patch
from .relative.path import get_data

params = [(3141, 55)]
raw_data = [{'a': 'fizz', 'b': 'buzz', 'c': 'foo', 'd': 'hello'}]
descriptors = ['taxi', 3141, 55, 1]

@patch.object(get_data, 'get_raw_data')
@patch.object(get_data, 'get_data_by_day')
def test_get_stuff_1(mock_get_data_by_day, mock_get_raw_data):
    mock_get_data_by_day.return_value = raw_data
    mock_get_raw_data.return_value = params
    result = get_data.get_stuff('taxi', 3141, '1', '3')
    assert result == (raw_data, descriptors)

我将脚本get_data.py作为对象导入,然后将每个函数get_raw_dataget_data_by_day作为此对象的属性进行修补。然后当我对我提供的模拟值运行单元测试时,它返回我期望的结果。