Pytest-django: استخدم المباريات في Django TestCase

تم إنشاؤها على ٤ يناير ٢٠١٨  ·  7تعليقات  ·  مصدر: pytest-dev/pytest-django

أنا أستخدم فئة Django TestCase لبعض وسائل الراحة - تحميل تركيبات ، تأكيدات خاصة ، وما إلى ذلك - لكني أرغب في استخدام بعض تركيبات pytest إن أمكن. يمكنني استخدام @pytest.mark.usefixtures لكن هذا لا يمنحني إمكانية الوصول إلى العناصر التي تعيدها التركيبات ، بقدر ما أستطيع أن أقول. على سبيل المثال ، إذا كنت أستخدم @pytest.mark.usefixtures("admin_client") ، فلن يكون عميل المسؤول الذي تم إنشاؤه بواسطة المباراة متاحًا في أي مكان يمكنني العثور عليه.

هل هناك طريقة لفعل هذا أنا في عداد المفقودين؟ أو مجرد شيء غير مدعوم؟

أرى في وثائق pytest أنه يمكن كتابة التركيبات لدعم العمل مع فئات TestCase بأسلوب وحدة الاختبار - https://docs.pytest.org/en/latest/unittest.html#mixing -pytest-plants-into-unittest-testcase -الفئات الفرعية-باستخدام العلامات ؛ هل سيكون هذا خيارًا لتركيبات pytest-django؟

التعليق الأكثر فائدة

rlskoeser شيء من هذا القبيل:

from django.test import TestCase

import pytest

from ..client import MagicClient


@pytest.mark.usefixtures("inject_attrs")
class TestGetSubjectId(TestCase):
    def test_something(self):
        result = self.admin_client.do_something()
        assert result is True


@pytest.fixture(scope="class")
def inject_attrs(request, admin_client):
    request.cls.admin_client = admin_client


@pytest.fixture
def admin_client():
    return MagicClient()

يمكنك حقن أي عدد تريده من تركيبات pytest في تركيبات inject_attrs . إذا كنت تفضل إرفاق التثبيت بالمثيل TestCase ، فقط استخدم request.instance بدلاً من request.cls .

اسمحوا لي أن أعرف إذا كان هذا غير واضح.

ال 7 كومينتر

rlskoeser Yup ، باستخدام نفس الإستراتيجية لـ Python unittest.TestCase كما تفعل مع django.test.TestCase للأعمال. يمكنك إما حقن تركيبات pytest في فئة الاختبار أو المثيل ، اعتمادًا على ما تحتاجه.

gsong آسف ، هل تقول أن هذا يعمل حاليًا؟ هل يمكنك تقديم مثال على رمز يوضح كيف يمكنني الوصول ، على سبيل المثال ، إلى admin_client داخل الفصل الدراسي؟

rlskoeser هل جربت شيئًا مثل:

import pytest


class TestOrders:
    def test_create_order(self, admin_client):
        response = admin_client.get('/myurl')
        assert response.status_code == 200

لست متأكدًا مما إذا كان هذا هو ما تبحث عنه.

rlskoeser شيء من هذا القبيل:

from django.test import TestCase

import pytest

from ..client import MagicClient


@pytest.mark.usefixtures("inject_attrs")
class TestGetSubjectId(TestCase):
    def test_something(self):
        result = self.admin_client.do_something()
        assert result is True


@pytest.fixture(scope="class")
def inject_attrs(request, admin_client):
    request.cls.admin_client = admin_client


@pytest.fixture
def admin_client():
    return MagicClient()

يمكنك حقن أي عدد تريده من تركيبات pytest في تركيبات inject_attrs . إذا كنت تفضل إرفاق التثبيت بالمثيل TestCase ، فقط استخدم request.instance بدلاً من request.cls .

اسمحوا لي أن أعرف إذا كان هذا غير واضح.

gsong شكرا لك على المقتطف الخاص بك! لسوء الحظ ، يبدو أن سجلات قاعدة البيانات للأشياء التي تم إنشاؤها في التركيبات لا يتم محوها بين المكالمات ، أليس كذلك؟ أعني أنه إذا كان لدي عدد قليل من الأساليب test_... في صفي ، ملفوفة بـ @pytest.mark.usefixtures فسيتم استدعاء الأداة لكل طريقة اختبار ، لكن قاعدة البيانات لا يتم تنظيفها.

محدث : هذا لأن التركيبات المستخدمة في زخرفة الفصل يجب تحديدها من خلال @pytest.fixture(scope="class") ، ثم كل شيء على ما يرام.

انظر أيضا: # 13 "تحميل سهل لاعبا اساسيا"

الختام كما أجاب.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات