【问题标题】:AssertionError: 400 != 201 when running APITestCase after TestCaseAssertionError: 400 != 201 在 TestCase 之后运行 APITestCase 时
【发布时间】:2015-06-07 08:24:35
【问题描述】:

问题来了: 我有 2 个单独的测试,一个基于 Django 的 TestCase,另一个继承自 APITestCase (Django Rest Framework)。单独运行时不会出现错误,但是当我在 TestCase self.assertEqual(response.status_code, status.HTTP_201_CREATED) 之后运行 APITestCase 时不再起作用。

下面是部分代码:

class CalendarTests(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            email='test@test.com', password='secret', username='tester')
        self.calendar = Calendar(owner=self.user, caltype='p', name='Test Calendar')
        self.calendar.save();

    def test_api_create_bla(self):
        self.client.login(username='test@test.com', password='secret')
        url = reverse('calendar-api')
        data_initial = {'text': 'testing hurray', 'cal_date':'2015-03-15', 'calendar':1}
        data_expected = {'cal_date': '2015-03-15',
                         'text': u'testing hurray',
                         'otype': 'd', 
                         'owner': u'tester', 
                         'calendar': 1,
                         'id': 1}

        response = self.client.post(url, data_initial, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(response.data, data_expected)
        self.client.logout()

任何帮助表示赞赏。

【问题讨论】:

  • 您收到 400 响应(错误请求)。您应该打印出request.data 以进行进一步诊断。
  • 贴出相应的观点。
  • @KlausD。没有请求对象(或者存在吗?),但打印响应显示日历 ID 无效。最后,问题出在 MySQL IntegrityError 和 ForeignKeys 中,因为我正在使用 InnoDB。我找到的解决方案是在运行测试时使用 MyISAM。
  • 谢谢@KlausD,你是对的,响应对象包含请求。请仔细阅读文档)

标签: python django django-rest-framework


【解决方案1】:

好的,伙计们,谢谢,我已经解决了。 通过打印响应对象,我发现 calendar_id 是错误的。因为我将 MySQL 与 InnoDB 一起使用(可能必须切换到 PostreSQL),所以 IntegrityError "Cannot add or update a child row: a foreign key constraint failed" 在第二个测试中导致了奇怪的行为。帮助我的解决方案是以这种方式将 settings.py 从 InnoDB 引擎切换到 MyISAM:

db_options = "INNODB"
import sys
if 'test' in sys.argv:
    db_options = "MYISAM"

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'callist',     
       'USER': 'test',
       'PASSWORD': 'test',
       'HOST': 'localhost',               
       'PORT': '80',                      
       'OPTIONS': {'init_command': 'SET storage_engine=' + db_options},
    }
}

会考虑切换到 PostreSQL。 感谢那些试图提供帮助的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2022-01-23
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多