【问题标题】:django testing class based view基于django测试类的视图
【发布时间】:2018-05-18 12:59:36
【问题描述】:

我有一个基于类的视图定义为:

class Myview(LoginRequiredMixin, View):

    def post():
      #.......

为了测试这个视图,我尝试了这个

class MyViewTest(TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.user = User.objects.create_user(
            username='jacob', email='soos@i.com', password='vvggtt')

    def view_test(self):
        # Create an instance of a POST request.
        request = self.factory.post('/my-url/')
        request.user = self.user

        response = MyView(request)
        print (response,"**")
        self.assertEqual(response.status_code, 200)

但这给出了这个错误。

    response = MyView(request)
TypeError: __init__() takes 1 positional argument but 2 were given

我明白为什么会出现这个错误(MyView 的导师有 2 个 ars),但我该如何删除它?我无法获得有关搜索的详细信息。

【问题讨论】:

  • 您是否在MyView 中实现了自己的__init__ 方法?如果可以的话可以发一下吗?
  • 通常request 不会被传递给类构造函数;见https://docs.djangoproject.com/en/2.0/ref/class-based-views/base/#django.views.generic.base.View.as_view
  • @user234461 不,我没有在 myview 中实现 init
  • 是的,MyView(request) 是错误的。构造函数不接受请求。见github.com/django/django/blob/master/django/views/generic/…
  • 这在我删除content_type时有效

标签: django django-class-based-views django-testing


【解决方案1】:

来自docs

# Use this syntax for class-based views.
response = MyView.as_view()(request)

【讨论】:

    【解决方案2】:

    我们可以使用django测试client

    from django.test import Client
    
    class MyViewTest(TestCase):
        def setUp(self):
            self.client = Client()
            self.user = User.objects.create_user(
                username='jacob', email='soos@i.com', password='vvggtt')
    
        def view_test(self):
            # Create an instance of a POST request.
            self.client.login(username="jacob", password="vvggtt")
            data = {'name': 'test name'}
            res = self.client.post('/my-url/', data)
            print(res)
            self.assertEqual(res.status_code, 200)
    

    【讨论】:

      【解决方案3】:

      试试

      response = MyView(request=request)
      

      【讨论】:

        【解决方案4】:

        Django 文档中有一个名为 Testing Class Based Views 的部分解决了这个问题:

        为了在请求/响应周期之外测试基于类的视图,您必须确保它们配置正确,方法是在实例化后调用 setup()。

        所以在你的情况下,这看起来像:

            def view_test(self):
                # Create an instance of a POST request.
                request = self.factory.post('/my-url/')
                request.user = self.user
        
                my_view = MyView()
                my_view.setup(request)
                response = my_view.post(request)
        
                self.assertEqual(response.status_code, 200)
        

        【讨论】: