【问题标题】:Django REST test ignores factory's urlDjango REST 测试忽略工厂的 url
【发布时间】:2016-04-20 12:33:27
【问题描述】:

我在为 Django REST 视图编写 APITestCase 时遇到了一个奇怪的错误。

这是我的代码:

class CreateUserTest(APITestCase):
    def setup(self):
        self.superuser = User.objects.create_superuser('vishnu@vishnu.com', '1989-10-06', 'vishnupassword')
        self.client.login(username='vishnu', password='vishnupassword')
        self.data = a bunch of trivial data

    def test_can_create_user(self):
        print "create user"
        self.setup()
        self.token = Token.objects.get(user_id=self.superuser.id)
        self.api_key = settings.API_KEY
        self.factory = APIRequestFactory()
        self.request = self.factory.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key,
                                    self.data,
                                    HTTP_AUTHORIZATION='Token {}'.format(self.token))
        force_authenticate(self.request, user=self.superuser)
        self.view = UserList.as_view()
        self.response = self.view(self.request)
        self.response.render()
        #print self.response.content
        self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)

如您所见,我将 factory.post 运行到故意错误的 url /api/v1/uaaaaaasers/

但是测试没有报错:

Creating test database for alias 'default'... 
create user .
---------------------------------------------------------------------- 

Ran 1 test in 0.199s

OK Destroying test database for alias 'default'...

它不应该因为那个错误的 url 而崩溃吗?我怎么知道测试进展顺利?

【问题讨论】:

    标签: django unit-testing testing django-rest-framework


    【解决方案1】:

    你在测试这一切都错了...... 您测试的响应来自直接视图调用...

    self.view = UserList.as_view()
    self.response = self.view(self.request)
    self.response.render()
        #print self.response.content
    self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
    

    您的上述情况将始终调用视图...

    在实际的测试用例中,我们使用客户端访问 url 并测试响应

    self.response = self.client.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key,
                                    self.data,
                                    HTTP_AUTHORIZATION='Token {}'.format(self.token))
    self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
    

    【讨论】:

    • 您从哪里获得示例中的 self.response?
    • @lapinkoira 在上面更新:)...您上面代码中的问题只是 django 没有将 url 映射到视图...您正在手动调用视图 :)
    【解决方案2】:

    如果您想测试向无效 url 发布请求,请使用 test client 而不是请求工厂。

    class CreateUserTest(APITestCase):
    
        def test_can_create_user(self):
           ...
           response = self.client.post(
               '/api/v1/uaaaaaasers/?api_key=%s' % self.api_key,
               self.data,
               ...
           )
           ...
    

    【讨论】:

    • 嗯我在这里很困惑,例如,我怎么知道我在所有测试中都没有拼错我的网址?我不能依赖请求工厂吗?或者如何在 django rest 中测试 api 视图的最佳实践?
    • 如果你使用请求工厂,你正在测试视图。您没有测试您的 url 模式是否配置了正确的视图。使用测试客户端模拟对特定 url 的请求,因此 正在 测试您的 url 配置。请求工厂为您提供了更多控制权,但很多时候这不是必需的,使用测试客户端更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2021-07-14
    • 2012-08-17
    • 2020-01-18
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多