0

私は、データベースを嘲笑して、次のメソッドをテストするためのユニットテストケースを作成しようとしています。どのように実際のデータベースサーバーに実際に接続せずにデータベース接続を模擬する。私はサンプルのテストケースで試してみました。それが正しいのかどうかはわかりません。私が間違っていれば私を修正してください。Pythonでデータベース接続pymysqlを単体テストする方法は?

//MySQL.py 
    class MySQL(): 

     retry_interval = 20000 

     def link(self, server,port): 
      try: 
       return pymysql.connect(server, username='name', passwd='pwd', db='demo', int(port)) 
       sys.stdout.write('Connected to database at {}:{}\n'.format(server,port)) 
      except: 
       sys.stderr.write('Retry database connection in {} ms...\n'.format(self.retry_interval)) 
       sleep(self.retry_interval/1000.0) 
       continue 

//test.py 
from unittest.mock import Mock, MagicMock 
from unittest.mock import patch 
import MySQL 

    @patch('MySQL.pymysql') 
    def testLink(self, mysql_mock): 
     mock_cursor = Mock.MagicMock() 
     mysql_mock.connect.return_value.cursor.return_value.__enter__.return_value = mock_cursor 
+0

限界をどこ*あなた*のエッジコードに達する。あなたの場合、 'pymysql.connect'はunittestの範囲外であり、嘲笑されるべきです。モックが正しく呼び出されているかどうかテストする必要があります。 @KlausD。 –

+0

大丈夫ありがとう。お試しください – Mythri

答えて

1

のみ有用なものあなたにも直接そのパッチを当てる可能性があるので、あなたが本当にMySQL.pymysqlでのテストは、connect方法であることができますunittestの最後の

//test.py 
from unittest.mock import Mock, MagicMock 
from unittest.mock import patch, call 
import MySQL 

@patch('MySQL.pymysql.connect') 
def testLink(self, connect_mock): 
    # You can configure a return value for the connection if you need to... 
    connect_mock.return_value = MagicMock(name='connection_return', return_value=...) 

    # You can now test that your connection is being called... 
    self.assertEqual(1, connect_mock.call_count) 

    # You can also check the call parameters... 
    self.assertEqual(connect_mock.call_args_list[0], call(server, username='name', passwd='pwd',...)) 
+0

こんにちは、ありがとうございます。私は例のコードに示したのと同じ方法で試しました。しかし、私は "リンク"または "pymysql.connect"への呼び出しだけを嘲笑すべきなのか混乱していますか? – Mythri

+0

@patch( 'MySQL.pymysql.connect')は未使用のインポートを提供し、SyntaxError:キーワード以外のキーワードargの後にarg – Mythri

+0

こんにちは。あなたが与えたコードをテストするために 'link'関数をモックする必要はないと思います。 'pymysql.connect'関数を擬似的に実行すると、疑わしい接続オブジェクトを返す' link'関数が呼び出されます。 – DatHydroGuy

関連する問題