Тест создания фабрики-мальчика не пройден при совместной работе, но успешен при работе в одиночку - PullRequest
0 голосов
/ 08 января 2019

Я использовал django для своего проекта, чтобы создать простую систему, основанную на местоположении. Поэтому я создал таблицу для адреса и хочу заполнить данные, используя factory_boy. Вот фрагмент кода:

# Some snippet....

class StateFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = State

    name = factory.Faker('state')
    short_code = factory.Faker('state_abbr')
    country = factory.Iterator(Country.objects.all())


class CityFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = City

    name = factory.Faker('country')
    state = factory.Iterator(State.objects.all())

# end snippet..

Итак, я попытался сделать тест для этой фабрики, вот фрагмент test_factories:

# Some snippet...

class StateFactoryTest(TestCase):
    def setUp(self):
        factories.CountryFactory.create()

    def test_create_many_states(self):
        total_states = 10
        factories.StateFactory.create_batch(total_states)
        self.assertEqual(models.State.objects.all().count(), total_states)


class CityFactoryTest(TestCase):
    def setUp(self):
        factories.CountryFactory.create()
        factories.StateFactory.create_batch(2)

    def test_create_many_cities(self):
        total_cities = 10
        factories.CityFactory.create_batch(total_cities)
        self.assertEqual(models.City.objects.all().count(), total_cities)

# end snippet...

Если я запускаю test для каждого Testcase, он будет работать успешно. Но если я выполню все тесты как один, произойдет сбой с сообщениями об ошибках (аналогично для всех классов тестирования), например:

======================================================================
ERROR: test_create_many_cities (abadfasdf.tests.apps.locations.test_factories.CityFactoryTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/abcd/miniconda3/envs/abadfasdf/lib/python3.7/site-packages/django/db/backends/utils.py", line 83, in _execute
    return self.cursor.execute(sql)
psycopg2.IntegrityError: insert or update on table "locations_state" violates foreign key constraint "locations_state_country_id_25677d21_fk_locations_country_id"
DETAIL:  Key (country_id)=(1) is not present in table "locations_country".

Нет ошибок миграции / базы данных. Я думаю, что проблема заключается в том, как TestCase выполняет откат данных при каждом тесте, как если бы PK всех объектов откат существовал без данных в базе данных.

Итак, что я могу сделать, чтобы пройти тест? Или мне просто пропустить тест? Сам завод работает.

...