لدي مشروع يعمل مع قاعدة بيانات تابعة لجهة خارجية ، وقد تمت إدارة جميع النماذج الخاصة بقاعدة البيانات هذه = False في Meta لأنني لا أريد إنشاؤها في db الخاص بي.
ما زلت أرغب في إجراء بعض الاختبارات ببيانات مزيفة. لذا فإن سؤالي هو: هل هناك أي طريقة لإنشاء نماذج غير مُدارة للاختبار فقط؟
حاولت العثور على شيء من شأنه أن يسمح لي باختبار النماذج غير المُدارة ، ولم أجد سوى حلولًا لاختبار django الافتراضي ، ولا شيء من شأنه أن يعمل مع pytest-django.
لذلك اخترقت علامة بتوقيع pytest.mark.django_use_model (نموذج) الذي ينشئ نموذجًا (أو نماذج) لنطاق العلامة متجاهلًا الإدارة = False.
pelme هل تعتقد أن هناك فرصة لأن هذه الأداة تنتمي إلى pytest-django؟ لدي بالفعل اختبارات لهذا ، ولكن إذا لم يكن هنا ، فلن أزعج نفسي بتحديث الوثائق ، لكنني سأقوم بإنشائها كمكوِّن إضافي مستقل بدلاً من ذلك.
إذا كان من الممكن دمجها في pytest-django ، أعتقد أنه سيكون من المنطقي جعل وحدات الاختبار المميزة بعلامة django_use_model لا تتطلب django_db ، لست متأكدًا من كيفية تحقيق ذلك.
إنه هنا: https://github.com/ojake/pytest-django/tree/unmanaged_model
هتافات.
أعتقد أنه سيكون مفيدًا.
ولكن من المنطقي أن تطلب علامة قاعدة البيانات ، لأنها ستضغط / تستخدم قاعدة البيانات.
أم أنك تشير إلى تخطي جزء الإعداد منه؟
كمرجع: https://docs.djangoproject.com/en/1.8/ref/models/options/#django.db.models.Options.managed.
على أي حال ، سيكون من الممكن تضمين / طلب أداة / علامة أخرى تلقائيًا مع جهازك.
مهلا.
حاليًا يجب أن يكون:
@pytest.mark.django_db
@pytest.mark.django_use_model(MyUnamanged)
def test_myunmanaged_model():
...
كان تفكيري أنه من الضروري نوعًا ما أنه إذا استخدم الاختبار نموذجًا ، فمن المرجح أن يصل إلى db ، لذلك يمكن حذف django_db ، ولكن ربما يكون من الأفضل إبقائه صريحًا.
بينما أحب الأسلوب الصريح (الذي يمكن استخدامه كعلامة) ، يمكن تضمينه (انظر _live_server_helper
، https://github.com/pytest-dev/pytest-django/blob/master/pytest_django /fixture.py#L350-L351):
request.getfuncargvalue('db')
ولكن بعد ذلك قد يطلب / يستخدم db
، عندما يُطلب transactional_db
صراحة - ألست متأكدًا ؟!
اختبار لهذا سيكون جيدا.
موضوع قديم ولكنني أحسب أنني سأقوم بنشر الحل البديل الخاص بي ، وهو بسيط وليس محددًا.
لديّ وحدات إعدادات مختلفة للتدريج ، والحث ، والاختبارات ، وما إلى ذلك ، ولكن يمكن تحقيق نفس النتيجة باستخدام متغيرات env أو خيارات سطر الأوامر
في بعض النماذج. py:
MANAGED = settings.AM_I_TESTING # Any logic/hard code that designates we're testing
class SomeModel(Model):
class Meta:
managed = MANAGED
لقد وجدت حلاً أنيقًا (أو حلًا بديلًا؟). ربما بعض ميزة django غير موثقة. بالنسبة للنماذج غير المُدارة ، تحتاج إلى إنشاء تطبيق مخصص وعليك إزالة مجلد التهجير وعدم إنشاء أي عمليات ترحيل. يجب أن يحمل التطبيق نفس الاسم مثل الاسم المستعار db في الإعدادات. ثم سيقوم تلقائيًا بإنشاء النماذج نيابة عنك. المرجع فقط في مصدر django: https://github.com/django/django/blob/06d34aab7cfb1632a1538a243db81f24498525ff/django/core/management/commands/migrate.py#L198
هذا يعمل بالنسبة لي مع django 2.2 وأحدث pytest
ملاحظة: تحتاج أيضًا إلى أن يكون لديك جهاز توجيه مخصص يقوم بتعيين تسميات التطبيقات إلى قواعد البيانات التي تحمل نفس الاسم.
التفاصيل هنا https://stackoverflow.com/a/38446760/611677
التعليق الأكثر فائدة
موضوع قديم ولكنني أحسب أنني سأقوم بنشر الحل البديل الخاص بي ، وهو بسيط وليس محددًا.
لديّ وحدات إعدادات مختلفة للتدريج ، والحث ، والاختبارات ، وما إلى ذلك ، ولكن يمكن تحقيق نفس النتيجة باستخدام متغيرات env أو خيارات سطر الأوامر
في بعض النماذج. py: