2013-05-12 112 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