Я использовал 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 всех объектов откат существовал без данных в базе данных.
Итак, что я могу сделать, чтобы пройти тест? Или мне просто пропустить тест? Сам завод работает.