我想爲因爲我不想單元,使用自定義pyodbc數據庫連接懲戒Django的單元pyodbc模塊調用測試
views.py
from django.http import JsonResponse, HttpResponseNotFound, HttpResponseBadRequest, HttpResponseServerError, HttpResponseForbidden
from django.core.exceptions import SuspiciousOperation
from django.utils.datastructures import MultiValueDictKeyError
import os
import pyodbc
# Create your views here.
db_credentials = os.environ.get('DATABASE_CREDENTIALS')
dbh = pyodbc.connect(db_credentials)
def get_domains(request):
if request.method == 'GET':
args = request.GET
elif request.method == 'POST':
args = request.POST
try:
cursor = dbh.cursor()
if 'owner' in args:
owner = args['owner']
cursor.execute('{call GET_DOMAINS_FOR_OWNER(?)}', owner)
else:
cursor.execute('{call GET_DOMAINS()}')
result = cursor.fetchall()
if(result):
return JsonResponse([row[0] for row in result], safe=False)
else:
return JsonResponse([], safe=False)
except pyodbc.Error as e:
return HttpResponseServerError(e)
except SuspiciousOperation as e:
return HttpResponseForbidden(e)
一些Django的意見單元測試測試將進入數據庫,我怎麼能嘲笑的行爲因爲:
- 因爲pyodbc的模擬庫將無法正常工作是一個Python C擴展
- 使用sys.modules中似乎並沒有工作,可能是因爲該模塊在views.py被使用,而不是tests.py
這裏是我的測試車手
tests.py
from django.test import SimpleTestCase
from sms_admin import *
# Create your tests here.
HTTP_OK = 200
HTTP_NOTFOUND = 404
class AdminTestCase(SimpleTestCase):
"""docstring for AdminTestCase"""
def test_get_pool_for_lds(self):
response = self.client.get('/sms_admin/get_pool_for_lds', {'domain': 'sqlconnect', 'stage': 'dev', 'lds': 'reader'})
self.assertEqual(response.content, b'pdss_reader')
self.assertEqual(response.status_code, HTTP_OK)
在這種情況下,db_mock應該是另一個Mock對象嗎? – tiagovrtr
db_mock是另一種模擬,它與修補程序get_db在測試環境中的返回值相同 –
@tiagovrtr我試圖讓我的答案更清晰。 –