سؤال

أحاول البدء في كتابة اختبارات الوحدة لـ 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:

  1. خطوة اختيارية: إنشاء ملف لضبط من قاعدة البيانات: python manage.py dumpdata --format=json > api/fixtures/testdata.json
  2. إنشاء دليل اختبار: api/tests
  3. إنشاء ملف فارغ __init__.py في api/tests
  4. إنشاء ملف اختبار: test_fixtures.py

Test Fixtures

  1. قم بتشغيل الاختبار (سيتم تحميل التركيبات الخاصة بك في قاعدة البيانات): python manage.py test api.tests

تحتاج إلى استيراد from django.test import TestCase و لا from unittest import TestCase. ذاك حل لي المشكلة.

إذا كنت قد تجاوزت setUpClass الطريقة ، تأكد من الاتصال super().setUpClass() الطريقة كخط الأول في الطريقة. الكود لتحميل التركيبات موجود في فئة testcase.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top