我想为因为我不想单元,使用自定义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我试图让我的答案更清晰。 –