32

RequestFactoryを使用して、次のテスト ケースで DetailView をテストしようとしています。

def test_device_homepage(self):
    request = self.factory.get('/devices/1/', {'pk': 1})

    response = DeviceView.as_view()(request)

    self.assertEqual(response.status_code, 404)

ただし、上記のテストを実行すると、次のエラー メッセージが表示されます。

AttributeError: Generic detail view DeviceView must be called with either an object pk or a slug.

作成後にリクエストを印刷すると、次のように表示されます。

<WSGIRequest
path:/devices/1/,
GET:<QueryDict: {u'pk': [u'1']}>,

私が知る限り、DetailView が上記のエラー メッセージを生成しているコード内のポイントを超えて処理できるようにするために必要なことはこれだけです。

完全を期すために、完全なトレースバックを以下に示します。

Traceback (most recent call last):
File "/vagrant/devices/tests/test_views.py", line 17, in test_device_homepage
response = DeviceView.as_view()(request)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py", line 86, in dispatch
return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py", line 108, in get
self.object = self.get_object()
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py", line 48, in get_object
% self.__class__.__name__)
4

1 に答える 1

62

Freenode IRC の #django チャンネルのおかげで、次の方法がビューにパラメーターを渡す正しい方法であることがわかりました。

response = DeviceView.as_view()(request, pk=1)

これが、RequestFactory を使用して DetailView や DeleteView などをテストしようとしている他の誰かに役立つことを願っています。

于 2013-05-10T13:12:53.163 に答える