3

テストでDjangoRESTフレームワークを使用する一部のビューにデータを投稿するのに問題があります。django_webtestを使用してユーザーAPIをテストしています。次のコードで問題が発生しています。

class UserApiTest(WebTest):

    def setUp(self):
        AdminFactory()

    def test_accessing_user_list_shows_one_user(self):
        user_list = self.app.get('/quickstart/users/', user='admin')
        assert_that(user_list.json, has_entry('count', 1))

    def test_posting_new_user_returns_url_for_user_detail(self):
        post_data = {'username': 'john', 'email': 'john.doe@example.com'} 
        user_create = self.app.post('/quickstart/users/', post_data, user='admin')
        url = 'http://localhost:80/quickstart/users/2/'
        assert_that(user_create.json, has_entry('url', url))

問題は、2番目のテストの実行時にCSRFエラーが発生することです。Django REST Frameworkのドキュメントを見ると、セッションベースの認証を使用している場合にのみCSRFエラーがトリガーされることがわかりました。したがって、基本認証を試してみることにしました。これは、Djangoのドキュメントによると、REMOTE_USER環境変数を設定するだけで済みます。

class UserApiTest(WebTest):

    extra_environ = {'REMOTE_USER': 'admin'}

    def setUp(self):
        AdminFactory()

    def test_accessing_user_list_shows_one_user(self):
        user_list = self.app.get('/quickstart/users/')
        assert_that(user_list.json, has_entry('count', 1))

    def test_posting_new_user_returns_url_for_user_detail(self):
        post_data = {'username': 'john', 'email': 'john.doe@example.com'} 
        user_create = self.app.post('/quickstart/users/', post_data)
        url = 'http://localhost:80/quickstart/users/2/'
        assert_that(user_create.json, has_entry('url', url))

ユーザーがこれらのページを表示することさえ許可されていなかったため(つまり、返された403のURLにアクセスした場合)、これはさらにうまく機能しませんでした。

私の質問は、django_webtestを使用して基本認証を適切に設定するにはどうすればよいですか?

4

1 に答える 1

6

問題に取り組んだ後、. だけではなく、完全な基本認証ヘッダーを渡す必要があることがわかりましたREMOTE_USER。これは、Django REST Framework がBasicAuthenticationバックエンドで基本認証を解析するためです。

class UserApiTest(WebTest):                                                     

    auth_password = base64.encodestring('admin:default').strip()               
    extra_environ = {                                                           
        'AUTH_TYPE': 'Basic',                                                   
        'HTTP_AUTHORIZATION': 'Basic {}'.format(auth_password),                 
        'REMOTE_USER': 'admin'}                                                

    def setUp(self):                                                            
        AdminFactory()                                                          

    def test_accessing_user_list_shows_one_user(self):                          
        user_list = self.app.get('/quickstart/users/')                          
        assert_that(user_list.json, has_entry('count', 1))                      

    def test_posting_new_user_returns_url_for_user_detail(self):                
        post_data = {'username': 'john', 'email': 'john.doe@example.com'}     
        user_create = self.app.post('/quickstart/users/', post_data)            
        url = 'http://localhost:80/quickstart/users/2/'                         
        assert_that(user_create.json, has_entry('url', url))

また、デフォルトでは、テストで作成するすべてのユーザーのis_staffフラグが yes に設定されていることを確認する必要があります。もちろん、Django REST に別のアクセス許可を設定した場合は、それらのアクセス許可が正しく設定されていることを確認する必要があります。

これが誰かに役立つことを願っています。

于 2013-01-07T18:30:30.133 に答える