Django AssertionError语言 - 302 is not 302



我为一个端点设置了一个超级简单的单元测试,该端点接受带有文件的POST请求,并在上传成功后将用户重定向到新页面。这个单元测试的目的是确保文件上传工作正常。

tests.py

c = Client()
with open('replays/static/test.txt', 'r', ) as f:
response = c.post(
'/upload/',
{
'summoner': 'test user',
'title': 'Testing title',
'replay': f
},
follow=False
)
print(response.status_code)
print(response.status_code == 302)
self.assertIs(response.status_code, 302)

$ python manage.py test replays
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
302
True
======================================================================
FAIL: test_create_replay (replays.tests.ReplayCreationTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/path/to/project/tests.py", line 52, in test_create_replay
self.assertIs(response.status_code, 302)
AssertionError: 302 is not 302
----------------------------------------------------------------------
Ran 1 test in 0.173s
FAILED (failures=1)
Destroying test database for alias 'default'...

如果我在调用测试客户端的post方法时更改以下重定向的参数,那么response_status为200

时一切都按预期工作tests.py - follow redirect

c = Client()
with open('replays/static/test.txt', 'r', ) as f:
response = c.post(
'/upload/',
{
'summoner': 'test user',
'title': 'Testing title',
'replay': f
},
follow=True
)
print(response.status_code)
print(response.status_code == 200)
self.assertIs(response.status_code, 200)

$ python manage.py test replays
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
200
True
.
----------------------------------------------------------------------
Ran 1 test in 0.196s
OK
Destroying test database for alias 'default'...

我错过了什么?这似乎不应该是断言语句的预期行为。我使用的是Django 3.1.

AssertIs检查x is y,即xy是否指向同一个对象。但是你可以有两个int对象,它们都是302,但不是同一个对象。

应该使用.AssertEqual(…)[Python-doc]:

self.assertEqual(302, response.status_code)

对于小整数,CPython解释器将为-5到256构造int对象,因此使用flyweight模式:

当前的实现为-5256之间的所有整数保持一个整数对象数组,当你在这个范围内创建一个int时,你实际上只是得到一个对现有对象的引用。

这意味着对于int在-5和256之间,它将引用相同的对象,对于超出该范围的值,它通常构造一个新对象。

相关内容

最新更新