【问题标题】:How to mock sqlite3.connect in Python如何在 Python 中模拟 sqlite3.connect
【发布时间】:2013-08-06 10:12:35
【问题描述】:

我在 Anaconda 环境下使用 Python 3.3。

我想模拟 sqlite3.connect。例如在MyTests(见下文)中,我希望test_sqlite3_connect 返回字符串connection,而不是实际的sqlite3.Connection 对象。

我试过修补它,但不起作用。

from unittest.mock import patch
import unittest

import sqlite3

@patch('sqlite3.connect')
def sqlite3_connect(self,connection_string):
    print('connect with : {0}'.format(connection_string))
    return 'connection '

class MyTests(unittest.TestCase):

    def test_sqlite3_connect(self):

        print('testing connection')

        dbc = DataBaseClass()


class DataBaseClass():

    def __init__(self):
        print('initialising database class')
        self.connection = sqlite3.connect('test database')

【问题讨论】:

    标签: unit-testing python-3.x anaconda


    【解决方案1】:

    我设法使用来自

    的快速指南部分的信息解决了这个问题

    http://www.voidspace.org.uk/python/mock/

    以下代码展示了两种模拟 sqlite3.connect 的方式。

    ''' An example of how to mock the sqlite3.connection method '''
    
    from unittest.mock import MagicMock,Mock
    import unittest
    import sqlite3
    
    class MyTests(unittest.TestCase):
    
        def test_sqlite3_connect_success(self):
    
            sqlite3.connect = MagicMock(return_value='connection succeeded')
    
            dbc = DataBaseClass()
            sqlite3.connect.assert_called_with('test_database')
            self.assertEqual(dbc.connection,'connection succeeded')
    
    
        def test_sqlite3_connect_fail(self):
    
            sqlite3.connect = MagicMock(return_value='connection failed')
    
            dbc = DataBaseClass()
            sqlite3.connect.assert_called_with('test_database')
            self.assertEqual(dbc.connection, 'connection failed')
    
        def test_sqlite3_connect_with_sideaffect(self):
    
            self._setup_mock_sqlite3_connect()
    
            dbc = DataBaseClass('good_connection_string')
            self.assertTrue(dbc.connection)
            sqlite3.connect.assert_called_with('good_connection_string')
    
            dbc = DataBaseClass('bad_connection_string')
            self.assertFalse(dbc.connection)
            sqlite3.connect.assert_called_with('bad_connection_string')
    
        def _setup_mock_sqlite3_connect(self):
    
            values = {'good_connection_string':True,
                      'bad_connection_string':False}
    
            def side_effect(arg):
                return values[arg]
    
            sqlite3.connect = Mock(side_effect=side_effect)
    
    
    class DataBaseClass():
    
        def __init__(self,connection_string='test_database'):        
            self.connection = sqlite3.connect(connection_string)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多