如何在Python中模拟sqlite3.connect [英] How to mock sqlite3.connect in Python

查看:217
本文介绍了如何在Python中模拟sqlite3.connect的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Anaconda环境下使用的是Python 3.3.

I am using Python 3.3, under the Anaconda environment.

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

I would like to mock sqlite3.connect. For example in MyTests (see below), I would like test_sqlite3_connect to return the string connection rather than an actual sqlite3.Connection object.

我尝试修补它,但这不起作用.

I have tried patching it, but that does not work.

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

推荐答案

我设法使用

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

以下代码显示了两种模拟sqlite3.connect的方法.

The following code shows two ways of mocking 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)

这篇关于如何在Python中模拟sqlite3.connect的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆