11

我有一个基于类的视图

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

4 回答 4

21

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

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

避免了不同模块中两个基于类的视图同名的问题。

于 2017-05-20T05:45:41.640 回答
4

可能这是一个老问题,但在 django>=1.8 断言中

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

AttributeError: 'function' object has no attribute 'func_name' 所以我把它改成了

self.assertEqual(found.func.__name__, HomePage.__name__)
于 2015-09-16T06:34:09.913 回答
2

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

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

请注意,这里我们指定HomePage.__name__而不是'HomePage'因为如果使用重构工具更改类的名称,这将被拾取。

这样做的缺点是,如果你连接了一个同名但来自不同模块的视图类,这个单元测试不会失败。当然,这对于通用视图类名称的风险更大,HomePage但对于其他视图类的风险应该更小。

于 2014-12-05T17:43:27.077 回答
0

我这样做是因为 Valentjedi 不适合我。我做了。:

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

希望能帮助到你

于 2018-02-24T16:31:07.860 回答