【发布时间】:2018-01-17 11:44:28
【问题描述】:
我是一个使用 Django 的新手。当我运行命令 python manage.py test 时,我不断收到以下 Error;
Tact/tact_api/lines/test_views.py", line 103, in
test_api_can_create_an_event
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
AssertionError: 400 != 201
----------------------------------------------------------------------
Ran 8 tests in 0.105s
非常感谢您在解决此问题方面的任何帮助!我自己的一些想法包括:
1) 我的 Event 对象发布请求中可能存在语法错误。请参阅下面的测试代码。 2)问题可能与配置有关。
供参考,见下文测试;
class EventViewTestCase(TestCase):
"""
Test suite for Event API views
"""
def setUp(self):
"""
Define the event test client and other test variables.
"""
user = User.objects.create(username="tactician")
# initialize client and force authentication
self.client = APIClient()
self.client.force_authenticate(user=user)
# create and post a new line using authorized user
# since user model instance is not serializable, use its Id/PK
self.line_data = {'owner': user.id, 'title': 'Title goes here'}
self.res = self.client.post(reverse('line-list'), self.line_data, format='json')
# create and post a new event linked to created line using authorized user
line = Line.objects.get()
self.event_data = {'owner': user.id, 'pk': line.id, 'title': 'Title goes here',
'desc': 'Desc. here', 'start': timezone.now(), 'end': timezone.now()}
self.response = self.client.post(reverse('event-list'), self.event_data, format='json')
def test_api_can_create_an_event(self):
"""
Test the api has event creation capability.
"""
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
序列化器;
class EventSerializer(serializers.HyperlinkedModelSerializer):
"""
Convert Event model instance into native Python datatypes to be rendered as JSON.
"""
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Event
fields = ('url', 'id', 'owner', 'created', 'modified', 'title', 'desc', 'start',
'end', 'line')
def get_fields(self, *args, **kwargs):
"""
create and return a new Event object (linked to a user owned Line) with validated data.
update and return an existing Event object with validated data.
"""
fields = super(EventSerializer, self).get_fields(*args, **kwargs)
view = self.context['view']
owner = view.request.user
fields['line'].queryset = fields['line'].queryset.filter(owner=owner)
return fields
【问题讨论】:
-
我认为更有价值的信息将是 config 和 urlconf ,请将此添加到问题中,或提供一些外部小提琴的链接。
-
@Take_Care_ - 谢谢。您可以在 [link] (github.com/KenyattaDaniel/tact/blob/master/tact_api/config/…) 上查看 url 配置文件,在 [link] (github.com/KenyattaDaniel/tact/blob/master/tact_api/lines/…) 上查看应用程序 url 文件,在 [link] (github.com/KenyattaDaniel/tact/blob/master/tact_api/config/…) 上查看基本配置文件。如果您更喜欢将此信息粘贴到问题中,请告诉我。
-
@Take_Care_ - 我终于解决了这个问题。原来我的测试模块中有一个轻微的语法错误。我将 self.event_data = {'pk': line.id...} 更改为 {'line': line.id...}。此外,在我的序列化程序模块中,我将类 EventSerializer(serializers.HyperlinkedModelSerializer): 更改为类 EventSerializer(serializers.ModelSerializer):。通过这些更改,我的测试现在可以运行了!
标签: python python-3.x django-rest-framework foreign-keys http-status-code-400