باستخدام Python 3.4 و pytest-django 2.8.0 و pytest 2.7.0 و django 1.7.6 و Postgresql 9.3.9
عند إجراء اختبارات الوحدة الخاصة بي ، لدي خطأ متقطع يعود من دوكتيست الوحيد. تمر جميع اختبارات الوحدة الخاصة بي على ما يرام ويستخدم الكثير منها قاعدة البيانات. هذا هو طلب الاختبار الخاص بي:
الوقت py.test -n 7 -s -v - المدد = 10
يجب إنشاء 273 هدفًا في سياق المحفظة.
274 >>> استيراد بيتيست
275 >>> علامة pytestmark = pytest.mark.django_db ()
276 >>> من حافظة استيراد نماذج
277 >>> p، new = Portfolio.objects.get_or_create (name = "نموذج للأهداف")
استثناء غير متوقع: الوصول إلى قاعدة البيانات غير مسموح به ، استخدم علامة "django_db" للتمكين
إزالة السطور 274 و 275 ليس لها تأثير.
معذرةً ، لا تعمل تركيبات الأطباء والاختبارات (التي تُستخدم لتجهيز قاعدة البيانات للاستخدام) جيدًا معًا. رسالة الخطأ مضللة ، ولكن إجراء عمليات قاعدة البيانات داخل العقيدة لا يدعمه pytest-django.
المبادئ التي تم استدعاؤها من عداء اختبار Django لم تنظف قاعدة البيانات AFAIK أبدًا ، وبدءًا من Django 1.6 ، لا يقوم عداء الاختبار الخاص بـ Django تلقائيًا بتشغيل العقيدة ، وبالتالي فهو ليس شيئًا من المحتمل أن يكون مدعومًا بشكل مباشر من قبل pytest-django أيضًا.
أعتقد أن أفضل رهان لك هو إعادة كتابة عقيدة واحدة إلى حالة اختبار عادية.
تضمين التغريدة
لقد وجدت أن التركيب التالي يسمح بالوصول إلى db في أطبائي
@pytest.fixture
def db_doctest(request, _django_cursor_wrapper):
from django.test import TestCase as django_case
_django_cursor_wrapper.enable()
request.addfinalizer(_django_cursor_wrapper.disable)
case = django_case(methodName='__init__')
case._pre_setup()
request.addfinalizer(case._post_teardown)
pelme سأكون سعيدًا بإنشاء
تضمين التغريدة
نعم ، أعتقد أنه سيكون أمرًا جيدًا ، ولكن يجب أن يتم تغطيتها بالاختبارات بالطبع.
شكرا للتعمق في هذا واقتراح حل!
phlax كيف تستخدم هذه المباراة؟ أعني ، ما هو الرمز الذي يتم وضعه في ملف دكتست؟
alanjds آسف ، لقد استغرق الأمر 3 سنوات للإجابة 8 / - لاحظت للتو السؤال عندما كنت أعيد اكتشاف الحل.
يمكنك تضمين تركيبات في العقيدة على سبيل المثال
>>> get_fixture('db_doctest')
لكن الحل أعلاه قد تغير أيضًا - يبدو أن هذا كافٍ لأداة العقيدة:
import pytest
@pytest.fixture
def db_doctest(db):
pass
اعتبارًا من يوليو 2020 ، سيكون getfixture('db')
في الجزء العلوي من أعمال الطبيب.
التعليق الأكثر فائدة
تضمين التغريدة
لقد وجدت أن التركيب التالي يسمح بالوصول إلى db في أطبائي
pelme سأكون سعيدًا بإنشاء