django - Django AssertRedirects 抛出断言错误 301 != 302
问题描述
我的 Django 视图在调用“get”时有条件地重定向到错误页面或目标页面。我正在使用 redirect(reverse()) 作为重定向逻辑。当我运行此应用程序时,url 重定向按预期工作。为了编写测试用例,我模拟了返回此重定向(reverse())的函数。我确认调用该方法时正在返回模拟响应。但是测试用例中的响应显示 http404ResponseNotFound 或断言 Error 301 != 302
。如何正确测试重定向?
如果我使用self.assertRedirects(response, '/view/step/123', fetch_redirect_response=False)
,它会抛出Assertion error: 301 != 302
如果我使用self.assertRedirects(response, '/view/step/123', status_code=301, fetch_redirect_response=False)
,它会抛出Assertion error: 404 != 200
Class MyView:
def foo(self):
try:
# some logic
return redirect(reverse('someview', kwargs={'key': '12345'}))
except(ExceptionClass1, ExceptionClass2) as err:
return errorView.as_view()(err)
def get(self):
# some logic
if (some_condition)
return self.foo() # Test case is for this line.
return something_else
Class MyViewTests:
@mock.patch(MyView.foo)
def test_1(self, mock_foo):
mock_foo.return_value = redirect(reverse('step', kwargs={'key': '123'}))
client = Client()
response = client.get('/myview', follow=True)
self.assertRedirects(response, '/view/step/123', fetch_redirect_response=False)
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/mock/mock.py", line 1346, in patched
return func(*newargs, **newkeywargs)
File "/usr/src/app/django/tests/test_api.py", line 488, in test_1
self.assertRedirects(response, '/view/step/123', fetch_redirect_response=False)
File "/usr/local/lib/python3.8/site-packages/django/test/testcases.py", line 274, in assertRedirects
self.assertEqual(
AssertionError: 301 != 302 : Initial response didn't redirect as expected: Response code was 301 (expected 302)
解决方案
这已解决。问题是所有后续请求也都在跟进,因为follow=True
如果我想断言重定向,这是必要的。因此,“assertRedirects”将针对最终重定向的状态代码断言为 target_status_code。200 似乎是默认值。就我而言,我不需要测试后续重定向的行为。所以,我将代码更改为self.assertRedirects(response, '/view/step/123', status_code=301, target_status_code=404)
推荐阅读
- java - 如何去掉spring boot权限做数据库结构改动
- authentication - 如何让我的注册功能自动登录(HTML、Flask、Python)
- typescript - RxJS 获取 Observable 发射前后的值
- database - SQLite:新表和列的逗号分隔值
- ios - 访问用户之前在 iOS 上取消、升级或删除的订阅的接收数据信息
- javascript - 将二进制数据保存到 mongodb nodejs
- exception - 在一系列 Erlang 匹配中,我如何判断其中哪一个失败了?
- ios - 将 Firebase 加载到 Tableview 中
- sql-server - 插入数据后 SQL Server 查询性能突然下降
- javascript - 如何在浏览器控制台上使用纯 JavaScript 访问 GPT 数据?