5

ミキサーを使用してモデルを生成し、pytest で実行しています。私がやりたいことは、モデルを 1 回だけ生成し、生成した同じモデルでいくつかのテストを実行することだけです。

ここに私が欲しいものがあります:

コード

import pytest
from mixer.backend.django import mixer
from weddings.models import Wedding


@pytest.mark.django_db
class TestProductApi(object):

    @pytest.fixture(scope="module")
    def wedding(self):
        wedding = mixer.blend(
            'weddings.Wedding',
        )
        mixer.cycle(12).blend(
            'weddings.Product',
            wedding=wedding,
        )

        mixer.cycle(4).blend(
            'weddings.Product',
            wedding=wedding,
            is_visible=False,
        )

        mixer.blend(
            'weddings.Product',
            wedding=wedding,
            is_active=False,
        )
        return wedding

    def test_number_one(self, wedding):
        print 'running test_number_one'
        print 'wedding.id == {}'.format(wedding.id)
        print 'Wedding.objects.all().count() == {}'.format(Wedding.objects.all().count())
        print 'finished test_number_one'

    def test_number_two(self, wedding):
        print 'running test_number_two'
        print 'wedding.id == {}'.format(wedding.id)
        print 'Wedding.objects.all().count() == {}'.format(Wedding.objects.all().count())
        print 'finished test_number_two'

出力

tests/weddings/api/test_products.pyTestProductApi.test_number_one                                                        0%           running test_number_one
wedding.id == 1
Wedding.objects.all().count() == 1
finished test_number_one
 tests/weddings/api/test_products.pyTestProductApi.test_number_one ✓                                                     50% █████
 tests/weddings/api/test_products.pyTestProductApi.test_number_two                                                       50% █████     running test_number_two
wedding.id == 1
Wedding.objects.all().count() == 0
finished test_number_two

テストで行っていることはそれほど重要ではありませんが、生成された同じオブジェクトですべてのテストを実行したいと考えていweddingます。weddingテストを実行すると、テストを作成するたびに新しいテストが作成されます。

これが私が使用しているもののバージョンです:
pytest==2.7.1
pytest-django==2.9.1
Django==1.8.8
mixer==5.3.1
python==2.7.6

EDIT 1 :フィクスチャにスコープを追加しようとしましたが、その作業は最初のテストのみです。2 番目のテストでクエリを実行すると、フィクスチャが正常に動作していても、モデルは存在しません。

編集 2 : をフィクスチャに挿入しscope="module"、実行されたテストの結果を表示します。

4

1 に答える 1

1

これは私にとってはうまくいきました。試してみる...

import pytest
from mixer.backend.django import mixer
from weddings.models import Wedding

@pytest.fixture(scope="class")
def wedding(self):
    wedding_obj = mixer.blend(
        'weddings.Wedding',
    ) 
    mixer.cycle(12).blend(
        'weddings.Product',
        wedding=wedding_obj,
    ) 

    mixer.cycle(4).blend(
        'weddings.Product',
        wedding=wedding_obj,
        is_visible=False,
    ) 

    mixer.blend(
        'weddings.Product',
        wedding=wedding_obj,
        is_active=False,
    ) 
    return wedding_obj

@pytest.mark.django_db
@pytest.mark.usefixtures("wedding")
class TestProductApi(object):

    def test_number_one(self, wedding):
        print 'running test_number_one'
        print 'wedding.id == {}'.format(wedding.id)
        print 'Wedding.objects.all().count() == {}'.format(Wedding.objects.all().count())
        print 'finished test_number_one'

    def test_number_two(self, wedding):
        print 'running test_number_two'
        print 'wedding.id == {}'.format(wedding.id)
        print 'Wedding.objects.all().count() == {}'.format(Wedding.objects.all().count())
        print 'finished test_number_two'
于 2016-07-26T12:35:08.443 に答える