假设我有一个目录
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
寻找任何建议和提示。
答案 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_data
和get_data_by_day
作为此对象的属性进行修补。然后当我对我提供的模拟值运行单元测试时,它返回我期望的结果。