gpt4 book ai didi

python - 如何模拟.patch MySQLdb.cursors?

转载 作者:行者123 更新时间:2023-11-28 17:38:08 24 4
gpt4 key购买 nike

class CanonDatabase:
def __init__(self, clean_up_db=False):
self.db = "tmg_canon_april_tokens"
self.conn = create_connection(self.db)
self.cur = self.conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)

我正在尝试 mock.patch MySQLdb 以传递构造函数。

@mock.patch.object(MySQLdb, '__init__')
class TestDatabase(unittest.TestCase):
def setUp(self):
super(TestDatabase, self).setUp()
patch = mock.patch('atone_canon.Database.create_connection')
mock_baz = patch.start()
mock_baz.cursor.return_value = mock.MagicMock()

def tearDown(self):
super(TestDatabase, self).tearDown()
mock.patch.stopall()

def test_clean_table(self, mysql_mock):
db = CanonDatabase()
self.assertEqual(True, False)

但是失败并显示以下错误消息:

File "atone_canon/Database.py", line 20, in __init__ self.cur = self.conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)

AttributeError: 'module' object has no attribute 'cursors'

我找到了一个方法:

如果我在我的单元测试中插入这个导入,甚至没有(!)使用它:

from MySQLdb.cursors import DictCursor

然后我就不会再收到错误了,我什至不必模拟 MySQLdb 包装器的补丁:

# @mock.patch.object(MySQLdb, '__init__')
class TestDatabase(unittest.TestCase):
...

对解决方案不太满意。通常,我很难模拟项目之外的类(例如,生活在 virtualenv 中)。我把这个留着,希望有人能告诉我如何模拟这些类。

最佳答案

首先:确保您有Database.py

import MySQLdb.cursors

否则,即使您不修补任何内容,也会出现您提到的错误。如果你想仔细检查它添加 cur=MySQLdb.cursors.DictCursor__init__ 的顶部并删除所有补丁:您会发现新行中出现了相同的错误。如果您加载 MySQLdb.cursors,该错误将消失在尝试指向 MySQLdb.cursors.DictCursor 之前在你的上下文中的某个地方.如果您想知道之前没有看到该错误是因为在您的生产代码中您导入了 MySQLdb.cursors使用前CanonDatabase()

现在做一个测试,你的构造函数将通过和 create_connection 邪恶 功能不要尝试连接任何东西都可以通过修补 create_connection 获得以及其他:

class TestSimpler(unittest.TestCase):
@mock.patch('atone_canon.Database.create_connection')
def test_base(self, mock_create_connection):
db = CanonDatabase()
self.assertIsNotNone(db)

当然你可以装饰测试类如果你想要补丁create_connection对于每一种测试方法。

关于python - 如何模拟.patch MySQLdb.cursors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com