Я хочу, чтобы сделать модульные тесты для некоторых взглядов Джанго, которые используют подключение пользовательских баз данных pyodbcДразнящего 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)
Поскольку я не хочу, чтобы блок Тесты, которые будут обращаться к базе данных, как я могу издеваться поведение при условии, что:
- Фиктивная библиотека не будет работать, так как pyodbc является расширением Python C
- Использование sys.modules, кажется, не работает, вероятно, потому, что модуль используется в views.py, а не на tests.py
Вот мой водитель-испытатель
tests.pyfrom 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 Я попытался сделать мой ответ более ясным. –