تحميل التركيبات في اختبارات وحدة Django
-
20-09-2019 - |
سؤال
أحاول البدء في كتابة اختبارات الوحدة لـ Django وأتناول بعض الأسئلة حول التركيبات:
لقد قمت بتجهيزات مشروع DB بأكمله (وليس تطبيقًا معينًا) وأريد تحميله لكل اختبار ، لأنه يبدو أنه لن يكون تحميل التثبيت فقط لتطبيق معين كافيًا.
أرغب في تخزين المباراة في /proj_folder/fixtures/proj_fixture.json.
لقد قمت بتعيين FIXTURE_DIRS = ('/fixtures/',)
في إعداداتي. ثم في testcase أحاول
fixtures = ['proj_fixture.json']
لكن تجهيزاتي لا يتم تحميلها. كيف يمكن حل هذا؟ كيفية إضافة المكان للبحث عن التركيبات؟ بشكل عام ، هل من المقبول تحميل المباراة الخاصة بـ Test_DB بالكامل لكل اختبار في كل تطبيق (إذا كان صغيرًا جدًا)؟ شكرًا!
المحلول
هل لديك حقًا مجلد /fixtures/
على القرص الصلب الخاص بك؟
ربما كنت تنوي استخدام:
FIXTURE_DIRS = ('/path/to/proj_folder/fixtures/',)
نصائح أخرى
لقد حددت المسار بالنسبة إلى جذر المشروع في testcase مثل SO:
from django.test import TestCase
class MyTestCase(TestCase):
fixtures = ['/myapp/fixtures/dump.json',]
...
وعملت دون استخدام FIXTURE_DIRS
الممارسة الجيدة تستخدم متغير Project_root في الإعدادات الخاصة بك.
import os.path
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
FIXTURE_DIRS = (os.path.join(PROJECT_ROOT, 'fixtures'),)
بدلاً من إنشاء مجلد Fixures ووضع التركيبات فيها (في كل تطبيق) ، فإن طريقة أفضل وعدم النشاط للتعامل مع هذا هي وضع جميع التركيبات في مجلد واحد على مستوى المشروع وتحميلها.
from django.core.management import call_command
class TestMachin(TestCase):
def setUp(self):
# Load fixtures
call_command('loaddata', 'fixtures/myfixture', verbosity=0)
استدعاء call_command
يعادل الجري:
manage.py loaddata /path/to/fixtures
لقد فعلت هذا ولم يكن عليّ إعطاء مرجع للمسار ، وكان اسم ملف التثبيت كافياً بالنسبة لي.
class SomeTest(TestCase):
fixtures = ('myfixture.json',)
لديك خياران ، اعتمادًا على ما إذا كان لديك تركيبات ، أو لديك مجموعة من رمز Python لإلغاء البيانات.
للتركيبات ، استخدم cls.fixtures
, ، كما هو موضح في إجابة لهذا السؤال ،
class MyTestCase(django.test.TestCase):
fixtures = ['/myapp/fixtures/dump.json',]
لبيثون ، استخدم cls.setUpTestData
:
class MyTestCase(django.test.TestCase):
@classmethod
def setUpTestData(cls):
cls.create_fixture() # create_fixture is a custom function
setUpTestData
يسمى من قبل TestCase.setUpClass
.
يمكنك استخدام كليهما ، وفي هذه الحالة يتم تحميل تركيبات setUpTestData
يسمى بعد تحميل التركيبات.
لنفترض أن اسم مشروعك hello_django
, ، لديه تطبيق اسمه api
. فيما يلي خطوات لإنشاء تركيبات في api
:
- خطوة اختيارية: إنشاء ملف لضبط من قاعدة البيانات:
python manage.py dumpdata --format=json > api/fixtures/testdata.json
- إنشاء دليل اختبار:
api/tests
- إنشاء ملف فارغ
__init__.py
فيapi/tests
- إنشاء ملف اختبار: test_fixtures.py
- قم بتشغيل الاختبار (سيتم تحميل التركيبات الخاصة بك في قاعدة البيانات):
python manage.py test api.tests
تحتاج إلى استيراد from django.test import TestCase
و لا from unittest import TestCase
. ذاك حل لي المشكلة.
إذا كنت قد تجاوزت setUpClass
الطريقة ، تأكد من الاتصال super().setUpClass()
الطريقة كخط الأول في الطريقة. الكود لتحميل التركيبات موجود في فئة testcase.