Tam*_*erz 5 python unit-testing
我正在尝试为将从MySQL数据库中提取数据的脚本设置一些测试.我在这里找到了一个看起来像我想做的例子,但它只给了我一个对象而不是结果:
<MagicMock name='pymysql.connect().cursor[38 chars]152'>
这是我正在使用的函数(simple.py):
import pymysql
def get_user_data():
connection = pymysql.connect(host='localhost', user='user', password='password',
db='db', charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
sql = "SELECT `id`, `password` FROM `users`"
cursor.execute(sql)
results = cursor.fetchall()
finally:
connection.close()
return results
Run Code Online (Sandbox Code Playgroud)
而且测试:
from unittest import TestCase, mock
import simple
class TestSimple(TestCase):
@mock.patch('simple.pymysql', autospec=True)
def test_get-data(self, mock_pymysql):
mock_cursor = mock.MagicMock()
test_data = [{'password': 'secret', 'id': 1}]
mock_cursor.fetchall.return_value = test_data
mock_pymysql.connect.return_value.__enter__.return_value = mock_cursor
self.assertEqual(test_data, simple.get_user_data())
Run Code Online (Sandbox Code Playgroud)
结果:
AssertionError: [{'id': 1, 'password': 'secret'}] != <MagicMock name='pymysql.connect().cursor[38 chars]840'>
Run Code Online (Sandbox Code Playgroud)
我正在使用Python 3.51
看起来你的mock缺少对游标的引用
mock_pymysql.connect.return_value.cursor.return_value.__enter__.return_value = mock_cursor
我总是发现模拟调用语法很尴尬,但MagicMock以迂回的方式显示出错了.它说它没有注册的返回值pymysql.connect.return_value.cursor
<MagicMock name='pymysql.connect().cursor[38 chars]840'>