繁体   English   中英

您如何模拟PyMySQL的返回值以在Python中进行测试?

[英]How do you mock a return value from PyMySQL for testing in Python?

我正在尝试为将从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

和测试:

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())

结果:

AssertionError: [{'id': 1, 'password': 'secret'}] != <MagicMock name='pymysql.connect().cursor[38 chars]840'>

我正在使用Python 3.51

看来您的模拟游戏缺少对游标的引用

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'>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM