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

时间:2014-12-05 16:50:40

标签: django django-views python-unittest django-unittest

我有一个基于类的视图

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

和url-pattern的定义如下:

urlpatterns = patterns('',
                  url(r'^$', HomePage.as_view()),
              )

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

class HomePageTest(TestCase):

def test_root_url_resolves_to_home_page_view(self):
    found = resolve('/')
    self.assertIsInstance(found.func, HomePage)

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

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

任何想法如何测试这个案例?

4 个答案:

答案 0 :(得分:15)

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

self.assertEquals(found.func.view_class, HomePage)

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

答案 1 :(得分:4)

可能是一个老问题,但在django&gt; = 1.8断言中

self.assertEquals(found.func.func_name, HomePage.__name__)

AttributeError:'function'对象没有属性'func_name'所以我将其更改为

self.assertEqual(found.func.__name__, HomePage.__name__)

答案 2 :(得分:1)

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

self.assertEquals(found.func.func_name, HomePage.__name__)

请注意,我们在此处指定HomePage.__name__而不是'HomePage',因为如果使用重构工具更改了类的名称,则会获取此信息。

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

答案 3 :(得分:0)

我做了另一种方式,因为Valentjedi不适合我; 我做了。:

class HomePageTest(TestCase):
    def test_root_url_resolves_to_home_page_view(self):
        found = resolve('/')
        self.assertEqual(found.view_name, "home")

希望有所帮助