Django 测试:当为该视图指定 login_required 时如何将 resolve() 的结果与视图函数进行比较
Django test: how to compare result of resolve() with view function when login_required is specified for that view
在urls.py中,我的观点细节用login_required[=注释33=] 将未经授权的用户转发到登录页面:
url(r'^(?P<id>[0-9]+)/$', login_required(views.detail), name = 'detail')
我正在尝试编写一个测试来检查在查询目标 url 上选择了哪个视图。我有 class 在测试开始前登录:
class LoggedInTestCase(TestCase):
def setUp(self):
user = User.objects.create_user('test', 'test@example.com', 'test')
self.client.login(username='test', password='test')
class ProductDetailTest(LoggedInTestCase):
def setUp(self):
super(ProductDetailTest, self).setUp()
def test_product_detail_url_resolves_product_detail_view(self):
view = resolve('/products/1/')
self.assertEquals(view.func, detail)
当我 运行 测试时我得到:
FAIL: test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\heroku\django\products\tests.py", line 46, in test_product_detail_url_resolves_product_detail_view
self.assertEquals(view.func, detail)
AssertionError: <function detail at 0x05CC3780> != <function detail at 0x053B38A0>
----------------------------------------------------------------------
检查哪个视图已解析
print('VIEW: ', view.view_name)
结果是:
test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest) ... VIEW: products:detail
当我删除 login_required 时,所有测试都顺利通过。
当你做login_required(detail)
时,装饰器returns一个新函数。你的断言应该在测试中失败,因为功能不一样。
这里有几个选项。在视图中使用装饰器可能是最简单的:
@login_required
def detail(request, *args, **kwargs)
...
并将 url 模式更改为:
url(r'^(?P<id>[0-9]+)/$', views.detail, name = 'detail'),
如果你需要使用未修饰的detail
视图,那么你不能那样使用装饰器。在这种情况下,您将 login_required(detail)
分配给一个新变量,
def detail(request, *args, **kwargs):
...
login_required_detail = login_required(detail)
将 URL 模式更改为,
url(r'^(?P<id>[0-9]+)/$', views.login_required_detail, name = 'detail'),
并将测试更改为:
self.assertEquals(view.login_required_detail, detail)
在urls.py中,我的观点细节用login_required[=注释33=] 将未经授权的用户转发到登录页面:
url(r'^(?P<id>[0-9]+)/$', login_required(views.detail), name = 'detail')
我正在尝试编写一个测试来检查在查询目标 url 上选择了哪个视图。我有 class 在测试开始前登录:
class LoggedInTestCase(TestCase):
def setUp(self):
user = User.objects.create_user('test', 'test@example.com', 'test')
self.client.login(username='test', password='test')
class ProductDetailTest(LoggedInTestCase):
def setUp(self):
super(ProductDetailTest, self).setUp()
def test_product_detail_url_resolves_product_detail_view(self):
view = resolve('/products/1/')
self.assertEquals(view.func, detail)
当我 运行 测试时我得到:
FAIL: test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\heroku\django\products\tests.py", line 46, in test_product_detail_url_resolves_product_detail_view
self.assertEquals(view.func, detail)
AssertionError: <function detail at 0x05CC3780> != <function detail at 0x053B38A0>
----------------------------------------------------------------------
检查哪个视图已解析
print('VIEW: ', view.view_name)
结果是:
test_product_detail_url_resolves_product_detail_view (products.tests.ProductDetailTest) ... VIEW: products:detail
当我删除 login_required 时,所有测试都顺利通过。
当你做login_required(detail)
时,装饰器returns一个新函数。你的断言应该在测试中失败,因为功能不一样。
这里有几个选项。在视图中使用装饰器可能是最简单的:
@login_required
def detail(request, *args, **kwargs)
...
并将 url 模式更改为:
url(r'^(?P<id>[0-9]+)/$', views.detail, name = 'detail'),
如果你需要使用未修饰的detail
视图,那么你不能那样使用装饰器。在这种情况下,您将 login_required(detail)
分配给一个新变量,
def detail(request, *args, **kwargs):
...
login_required_detail = login_required(detail)
将 URL 模式更改为,
url(r'^(?P<id>[0-9]+)/$', views.login_required_detail, name = 'detail'),
并将测试更改为:
self.assertEquals(view.login_required_detail, detail)