django如何断言url模式解析以纠正基于类的视图函数

sur*_*jan 8 django django-views django-unittest python-unittest

我有一个基于类的视图

class HomePage(View):
   def get(self, request):
       return HttpResponse('<p>This is content.</p>')
Run Code Online (Sandbox Code Playgroud)

和url-pattern定义如下:

urlpatterns = patterns('',
                  url(r'^$', HomePage.as_view()),
              )
Run Code Online (Sandbox Code Playgroud)

为了这个模式解析为当前的视图函数,我写了一个这样的测试:

class HomePageTest(TestCase):

def test_root_url_resolves_to_home_page_view(self):
    found = resolve('/')
    self.assertIsInstance(found.func, HomePage)
Run Code Online (Sandbox Code Playgroud)

通过运行此单元测试,我收到以下错误:

self.assertIsInstance(found.func, HomePage)
AssertionError: <function HomePage at 0x7f85dd2c7840> is not an instance of <class 'web.views.HomePage'>
Run Code Online (Sandbox Code Playgroud)

任何想法如何测试这种情况?

小智 15

Django View.as_view()创建了一个具有view_class指向基于类的视图的属性的函数.所以使用:

self.assertEquals(found.func.view_class, HomePage)
Run Code Online (Sandbox Code Playgroud)

避免在具有相同名称的不同模块中出现两个基于类的视图的问题.


rob*_*cox 3

Resolve 将返回调用时返回的函数HomePage.as_view(),而不是该类型的对象。但是,通过快速测试,您可能可以通过一种方法来编写此测试:

self.assertEquals(found.func.func_name, HomePage.__name__)
Run Code Online (Sandbox Code Playgroud)

请注意,这里我们指定了HomePage.__name__not ,'HomePage'因为如果使用重构工具更改了类的名称,则会拾取该值。

这样做的缺点是,如果您连接了具有相同名称但来自不同模块的视图类,则此单元测试不会失败。当然,对于通用视图类名称(例如),这会带来更大的风险,HomePage但对于其他视图类,风险应该较小。