Как исправить ошибки IntegrityErrors во время разрыва Django TestCase? - PullRequest
0 голосов
/ 10 апреля 2019

Я портирую большое веб-приложение с Python 2.7 на Python 3.6.Я управлял миграцией базы данных и конвертировал код, используя 2to3, но у меня проблемы с запуском моего пакета тестирования.Для большого количества тестов я получаю сообщения об ошибках:та же проблема, что и у меня.

Также примечательно: если я запускаю отдельный тестовый файл сам (т.е. py.test /path/to/file), то эта ошибка не возникает.Я думаю, что это должно быть связано с тем, как данные базы данных обрабатываются между тестами.

Вот пример теста, который не проходит:

  1 
  2 from django.utils import timezone
  3 from tests.tests_probex.tests_python.testing_utilities import LoggedInTestCase
  4 from tests.tests_probex.tests_python.factories import JobFactory
  5 from probex.models import Profile, Tenant, Job
  6 from probex.views.reports import build_tenant_report
  7 from django.contrib.auth.models import User
  8 import pytest
  9 
 10 pytestmark = pytest.mark.xfail(reason="Not working in Python 3.6")
 11                                                                                                                             
 12                                                                                                                             
 13 class TestTenantReport(LoggedInTestCase):                                                                                   
 14     def setUp(self):                                                                                                        
 15         super(TestTenantReport, self).setUp()                                                                               
 16         self.end_date = timezone.now()                                                                                      
 17         self.delta = timezone.timedelta(days=7)                                                                             
 18         self.start_date = self.end_date - self.delta                                                                        
 19                                                                                                                             
 20         self.date = timezone.now() - timezone.timedelta(days=3)                                                             
 21         self.job = JobFactory(absolute_num=1600, relative_num=1600, protocol=self.protocol, project=self.project, status='Co
    mplete', created=self.date, submitter_id=self.user.id)                                                                      
 22                                                                                                                             
 23     def test_returns_new_users(self):                                                                                       
 24         users = User.objects.all()                                                                                          
 25         for user in users:                                                                                                  
 26             user.date_joined = self.date                                                                                    
 27             p = Profile.objects.get(user_id=user.id)                                                                        
 28             tenant = Tenant.objects.get(id=p.tenant_id)                                                                     
 29             tenant.app_scientist = self.user                                                                                
 30             user.save()                                                                                                     
 31             tenant.save()                                                                                                   
 32                                                                                                                             
 33         report = build_tenant_report(self.user)                                                                             
 34         self.assertGreaterEqual(report['new_users'].count(), users.count()) 

LoggedInTestCase является подклассом djangoTestCase:

 15 class LoggedInTestCase(TestCase):
 16     def setUp(self):
 17         self.user = User.objects.create_user(username='dummy@hotmail.com', email='dummy@hotmail.com', password="secret123")
 18         self.user.user_permissions.add(Permission.objects.get(codename='add_job'))
 19         self.user.user_permissions.add(Permission.objects.get(codename='change_job'))
 20         self.user.user_permissions.add(Permission.objects.get(codename='add_project'))
 21         self.user.user_permissions.add(Permission.objects.get(codename='add_user'))
 22         self.user.user_permissions.add(Permission.objects.get(codename='change_user'))                                                               
 23         self.tenant = Tenant.objects.create(name="testtenant")                                                                                       
 24         self.user.profile.tenant = self.tenant                                                                                                       
 25         self.user.profile.save()                                                                                                                     
 26         self.project = ProjectFactory(name="testproject", tenant=self.tenant, active=True, identifier='AAA')                                         
 27         self.protocol = ProtocolFactory()                                                                                                            
 28         self.root_term = TermFactory(is_root=True, acc='all')                                                                                        
 29         self.login()                                                                                                                                 
 30                                                                                                                                                      
 31     def login(self):                                                                                                                                 
 32         self.client.login(username='dummy@hotmail.com', password='secret123')                                                                        
 33                                                                                                                                                      
 34     def logout(self):                                                                                                                                
 35         self.client.logout()                                                                                                                         
 36                                                                                                                                                      
 37     def get_user(self):                                                                                                                              
 38         return self.client                                                                                                                           
 39                                                                                                                                                      
 40     def permission_restricted(self, response, first_stop_url):                                                                                       
 41         first_redirect, status_1 = response.redirect_chain[0]                                                                                        
 42         second_redirect, status_2 = response.redirect_chain[1]                                                                                       
 43         self.assertEqual(first_redirect, first_stop_url)                                                                                             
 44         self.assertEqual(status_1, 302)                                                                                                              
 45         self.assertEqual(second_redirect, reverse('home'))                                                                                           
 46         self.assertEqual(status_2, 302)   

Эти тесты проходили при запуске под Python 2.7, и я мало что изменил, за исключением обновления до 3.6.Я все еще ожидал бы их прохождения сейчас.Если у кого-то есть указатели, я был бы очень признателенПервый постер здесь.

1 Ответ

0 голосов
/ 11 апреля 2019

Для всех, кто сталкивается с этим: намек был на ключи, которые были нарушены. historicalproject и history_user относятся к пакету django-simple-history. Мы закончили тем, что обновили наши фабричные генераторы мальчика, чтобы также включить Историческую фабрику. Это решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...