2013-05-12 129 views
4

我想寫一個unittest,檢查數據庫連接是否遇到異常時是否返回正確的錯誤消息。我試過使用connection.creation.destroy_test_db(':memory:'),但沒有按照我的預期工作。我想我應該刪除表或以某種方式切斷數據庫連接。有這些可能嗎?沒有數據庫連接的django unittest

+1

也許你可以提出一個DatabaseError並抓住它。 from django.db import DatabaseError raise DatabaseError 這裏列出了默認的django異常https://docs.djangoproject.com/zh/dev/ref/exceptions/ – Azd325 2013-05-12 13:42:59

+0

我很困惑。這個問題的標題是「沒有連接」,但在你說的正文中,你試圖斷言當有異常時返回的消息。像什麼?重複密鑰?標題和身體不太匹配,我只是困惑。澄清? – CppLearner 2013-05-12 20:08:41

+1

沒有連接到數據庫引發DatabaseError異常,這是我試圖導致和斷言我的web應用程序在這種情況下打印的錯誤消息 – tampakrap 2013-06-08 19:18:23

回答

4

我在演示文稿Testing and Django by Carl Meyer中找到了我的答案。這是我如何做的:

from django.db import DatabaseError 
from django.test import TestCase 
from django.test.client import Client 
import mock 

class NoDBTest(TestCase): 
    cursor_wrapper = mock.Mock() 
    cursor_wrapper.side_effect = DatabaseError 

    @mock.patch("django.db.backends.util.CursorWrapper", cursor_wrapper) 
    def test_no_database_connection(self): 
     response = self.client.post('/signup/', form_data) 
     self.assertEqual(message, 'An error occured with the DB') 
3

聽起來像這樣是mocking的工作。例如,如果你正在使用MySQL,你可以把一個side_effectconnect方法,像這樣:

from django.test import TestCase 
from mock import patch 
import MySQLdb 


class DBTestCase(TestCase): 
    def test_connection_error(self): 
     with patch.object(MySQLdb, 'connect') as connect_method: 
      connect_method.side_effect = Exception("Database Connection Error") 

      # your assertions here 

希望有所幫助。

+0

感謝您的答覆!我做了一些稍微不同的事,看我的答案。 – tampakrap 2013-06-08 19:19:00

2

我一直在尋找一個數據庫連接超時的情況下,Django的實際HTTP響應代碼使用pymysql時。以下測試證實401 Unauthorizedpymysql產生了OperationalError

from unittest.mock import patch 

import pymysql 
from django.test import TestCase, Client 


class TestDatabaseOutage(TestCase): 
    client = None 

    def setUp(self): 
     self.client = Client() 

    def test_database_connection_timeout_returns_401(self): 
     with patch.object(pymysql, 'connect') as connect_method: 
      message = "Can't connect to MySQL server on 'some_database.example.com' ([Errno 110] Connection timed out)" 
      connect_method.side_effect = pymysql.OperationalError(2003, message) 
      response = self.client.get('/') 
      self.assertEqual(response.status_code, 401) 

401 Unauthorized http cat