2013-08-06 1 views
3

Я использую Python 3.3 в среде Anaconda.Как mock sqlite3.connect в Python

Я хотел бы высмеять sqlite3.connect. Например, в MyTests (см. Ниже), я бы хотел, чтобы test_sqlite3_connect вернул строку «соединение», а не фактический объект 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') 

ответ

4

мне удалось решить вопрос, используя информацию из раздела Краткого руководства по

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^