3

我无法将数据发布到在我的测试中使用 Django REST 框架的某些视图。我正在使用 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))

问题是第二次测试运行时出现 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))

这更糟糕,因为用户甚至没有被授权查看这些页面(即访问 URL 返回的 403)。

我的问题是:如何使用 django_webtest 正确设置基本身份验证?

4

1 回答 1

6

解决该问题后,我发现我需要传递完整的基本身份验证标头,而不仅仅是REMOTE_USER. BasicAuthentication这是因为 Django REST Framework 在其后端解析基本身份验证。

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 回答