我有一个基于类的视图
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'>
任何想法如何测试这个案例?
答案 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")
希望有所帮助